Promise的串行,并行,并发
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>promise test</title> </head> <body> <script> Promise.serial = function(promiseGens,allowFail){ let seq = Promise.resolve(); promiseGens.forEach(function(item){ seq = allowFail ? seq.then(item).catch(err => err) : seq.then(item); }); return seq; } //单个promise reject后,继续执行 Promise.parallel = function(promiseGens){ let allPromise = new Promise(function(resolve,reject){ let results = []; promiseGens.forEach(function(item){ item() .then(data => results.push(data)) .catch(err => results.push(err)) .finally(function(){ if(results.length == promiseGens.length){ resolve(results); } }) }); }); return allPromise; } Promise.concurrency = function(promiseGens,concurrency,allowFail){ let promiseGenCopys = [].concat(promiseGens); let concurrencyPromises = []; let res = []; while(concurrency--){ concurrencyPromises.push(recur(promiseGenCopys)); } return Promise.all(concurrencyPromises).then(_ => res); // return Promise.parallel(concurrencyPromises); function recur(promiseGens){ if(!promiseGens.length) return Promise.resolve(); let first = promiseGens.shift(); return first().then(function(data){ res.push(data); return recur(promiseGens); }).catch(function(err){ res.push(err); return allowFail ? recur(promiseGens) : err; }) } } </script> <script> // 异步函数a var a = function () { return new Promise(function (resolve, reject) { setTimeout(function () { console.log('resolve a'); resolve('a'); }, 500) }) } // 异步函数b var b = function (data) { return new Promise(function (resolve, reject) { setTimeout(() => { console.log('reject b',data); reject(data||'reject'+ 'b'); },500) }) } // 异步函数c var c = function (data) { return new Promise(function (resolve, reject) { setTimeout(function () { console.log('resolve c',data); resolve(data||'reject' + 'c'); }, 500) }) } // 异步函数c var d = function (data) { return new Promise(function (resolve, reject) { setTimeout(function () { console.log('resolve d',data); resolve(data||'reject' + 'd'); }, 500) }) } // 异步函数c var e = function (data) { return new Promise(function (resolve, reject) { setTimeout(function () { console.log('reject e',data); reject(data||'reject' + 'e'); }, 500) }) } // 异步函数c var f = function (data) { return new Promise(function (resolve, reject) { setTimeout(function () { console.log('reject f',data); reject(data||'reject' + 'f'); }, 500) }) } //串行测试 // Promise.serial([a,b,c,d,e,f],true).then(function(data){ // console.log(data); // }).catch(function(err){ // console.log('catch',err); // }); //并行测试 // Promise.parallel([a,b,c,d,e,f]).then(function(data){ // console.log(data); // }).catch(function(err){ // console.log(err); // }); //并发测试 Promise.concurrency([a,b,c,d,e,f],2,true).then(function(data){ console.log(data); }).catch(function(err){ console.log(err); }) </script> </body> </html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具