通过循环串联Promise的then方法能否保证执行顺序?
关于Promise链式调用顺序的问题
我正在学习JavaScript,编写了以下代码:
const functions = [ prom => { console.log(1) return prom }, prom => { console.log(2) return prom }, prom => { console.log(3) return prom } ] let prom = new Promise((resolve, reject) => { resolve() }) for(functionIndex in functions){ prom = prom.then(functions[functionIndex]) }代码运行正常,但我不确定是否总能按函数数组的顺序执行传入的函数,请问我的这一假设是否正确?
你的假设是完全正确的,这些函数一定会严格按照数组的顺序(1→2→3)依次执行,原因如下:
- Promise的
.then()机制决定了链式调用的顺序性:每一个.then()注册的回调函数,都会等待前一个Promise的状态变为resolved之后才会被执行。你在循环中不断将prom更新为prom.then(...),本质是构建了一条严格的Promise执行链,只有前一个回调执行完成,才会触发下一个.then()中的函数。 - 你使用的
for...in遍历纯元素数组时,会按数组索引的升序(0、1、2)依次获取函数,不会出现乱序的情况(只要你没有给数组添加非索引类型的自定义属性)。
额外补充:哪怕你的数组中的函数返回的是新的异步Promise(比如包含API请求、定时器等操作),链式调用依然会保证执行顺序——.then()会等待当前回调返回的Promise完成后,再执行下一个回调函数。
内容的提问来源于stack exchange,提问作者Axel Carrère
相关产品推荐
相关产品推荐

