js 可以提升promise顺序 吗

Awbeci
  • 2.8k

比如我有三个promise方法,A、B、C,按照promise原理,是先执行A接着B最后C,如果我想让C在B之前执行,如何做呢?

回复
阅读 1k
2 个回答

多个没关关联的 Promise 之间本身是没有顺序的。
如果需要顺序,可以通过 Promise 对象的 .then() 来指定该 Promise 完成之后进行什么操作,包括发起另一个 Promise。

startPromiseA().then(() => startPromiseC()).then(() => startPromiseB());

由于 .then() 的处理在步骤较多的时候看起来比较难受,所以可以使用 await 来简化代码

await startPromiseA();
await startPromiseC();
await startPromiseB();

参考阅读:理解 JavaScript 的 async/await

lie5860
  • 726

本质上promise只是一种异步的描述,并不期望你掌握执行的顺序的。
如果你想要掌控顺序 就需要调整成同步的操作。
例如。
await C();await B();

根据额外补充需求中的 三个函数不在同一个文件中的情况。可以增加调度器(以EvenBus举例),转交控制权到调度器。在异步函数回调中触发事件传递执行函数。在调度器中编写具体的调整顺序的逻辑。

B().then(() => eventbus.$emit('someKey', () => ({key: 'B', fn: workB})))
C().then(() => eventbus.$emit('someKey', () => ({key: 'C', fn: workC})))

const fns = {};
eventbus.$on('someKey', async ({key, fn}) => {
  if (fns['C'] && key === 'B') {
    await fns['C']
    await fn
    fns['C'] = undefined
  } else if (fns['B'] && key === 'C') {
    await fn
    await fns['B']
    fns['B'] = undefined
  } else {
    fns[key] = fn
  }
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏