如何手写一个 Promise.all
Promise.all的完成体应该符合以下特征:
- 输入为Iterator类型的参数,可以是Array,Map, Set,String ,可能也得包括魔改的Iterator(Symbol.iterator)之类
- 若输入的可迭代数据里不是Promise,则也需要原样输出
- 返回一个Promise实例,可以调用then和catch方法
- 输出在then里体现为保持原顺序的数组
- 输出在catch体现为最早的reject返回值
- 空 Iterator, resolve返回空数组
function all(iterArr){
let results=[];//所有数据resolve之后,返回的结果存在results
return new Promise((resolve,reject)=>{
for(let i=0;i<iterArr.length;i++){
Promise.resolve(iterArr[i]).then(res=>{
results[i]=res;
if(results.length===iterArr.length){
resolve(results);
}
}).catch(e=>reject(e)) //当发生异常时,直接reject
}
})
}
let p1 = Promise.resolve(3);
let p2 = 1337;
let p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
all([p1, p2, p3]).then(values => {
console.log(values); // [3, 1337, "foo"]
});
all([10, 11, 12]).then(values => {
console.log(values); // [3, 1337, "foo"]
});
Promise.resolve()用于将现有对象转换为Promise对象,从而控制异步流程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?