gpt4 book ai didi

javascript - 为什么 .then 不在异步函数中的前一个 .then 之后执行?

转载 作者:行者123 更新时间:2023-12-03 00:16:37 25 4
gpt4 key购买 nike

多次调用_dispatch有时会导致传递给_dispatch的promise同时执行。 .then 不是应该在前一个 .then 之后执行吗?

// Failing code
async _dispatch (promise) {
// this._mutex is a Promise
this._mutex = this._mutex.then(() => promise)
return Promise.resolve(this._mutex)
}

// Possibly working code
async _dispatch (promise) {
console.log('START_CS', promise)
while (Atomics.load(this.done, 0) === 0) {
await this.sleep(50)
}
Atomics.store(this.done, 0, 0)
console.log('IN_CS', promise)
const ret = await promise
Atomics.store(this.done, 0, 1)
console.log('END_CS', promise)
return ret
}

_dispatch 按以下方式使用:

async getStatus (ports) {
const request = // ...
return this._dispatch(someAsyncFunctionReturningArray(request, ports))
}
const polling = () => {
const sleep = new Promise(resolve => setTimeout(resolve, 500))
const status = this.getStatus().then(() => {}).catch(() => {})
return Promise.all([sleep, status])
.then(polling)
}
polling()

polling() 和另一个类似的代码块同时运行。我注意到 someAsyncFunctionReturningArray 是同时调用的。

最佳答案

Promise 携带有关任务状态的信息,并允许您根据该状态采取行动。一般来说,它们本身并不代表任务。这相当于您正在做的事情:

async function foo() {
console.log('foo() task ran');
}

function delay() {
return new Promise(resolve => {
setTimeout(resolve, 1000);
});
}

const promise = foo();

delay().then(() => promise)

这不会使 promise 延迟一秒,因为 promise 只是一个可以说“以值 X 解析”、“以错误 Y 拒绝”的对象”或“待定”。不存在延迟 promise 的概念——你延迟了任务。这项工作由 foo 完成,并在您调用 foo() 时开始。

目前还不清楚您的问题中正确的替换是什么。我认为这就是您想要的:

_dispatch (action) {
this._mutex = this._mutex.then(() => action())
return this._mutex
}
async getStatus (ports) {
const request = // ...
return this._dispatch(() => someAsyncFunctionReturningArray(request, ports))
}

但可能有一种效果更好的完全不同的方法,我们需要更多有关您试图使用此队列完成的任务的详细信息来推荐一种方法。

关于javascript - 为什么 .then 不在异步函数中的前一个 .then 之后执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54508055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com