我发现了这个承诺的代码段,可以在Promise.race()中使用该代码段,以防止等待较长的异步操作(如果我的并行代码完成得更快)。
let stopCallback = null;
const stopPromise = new Promise(x => stopCallback = x);
await stopPromise; // promise pending until stopCallback() will be executed somewhere
但是我无法完全理解此Promise的工作原理。
请,有人可以向我解释这个承诺是如何解决的,或提供任何链接到详细描述这种用例的地方吗?
答案 0 :(得分:1)
IMO,如果您叫x
另一个名字,则更清楚:
let stopCallback = null;
const stopPromise = new Promise( resolve => stopCallback = resolve);
实际上,每当您调用stopCallback()
时,就等同于调用resolve()
并解决了Promise。
答案 1 :(得分:0)
Promise具有2个回调函数。 1)解决和2)拒绝
let stopCallback = null;
const stopPromise = new Promise((resolve,reject) => {
// call here resolve or reject ,by this promise exexution will be completed
// resolve('data') or reject('data')
});
(async () => {
const resolvedOrRejectedData = await stopPromise;
})
如果您不解决或拒绝承诺,则它将保持待处理状态。
答案 2 :(得分:0)
实际上,Promise是只是回调的包装器。它可以(或多或少)写为:
class Promise {
_resolved = undefined;
_handlers = [];
constructor(callback) {
callback(function resolve(value) {
this._resolved = value;
this._handlers.forEach(h => h(value));
}, /*reject*/);
}
then(handler) {
if(this._resolved) handler(this._resolved);
this._handlers.push(handler);
// return new Promise(...);
}
}
因此,换句话说:如果您呼叫promise.then(callback)
,则callback
将存储在promise中。然后,当您调用承诺的resolve()
时,它将遍历存储的所有回调并对其进行调用。
现在await stopPromise;
对该诺言调用.then(...)
,并向其传递一个内部函数,该函数在被调用时将恢复当前async function
的执行。然后,它停止该功能的执行。因此,如果您通过回调解决了您的诺言,则所有.then(...)
回调都会被调用,同时也会在异步函数中注册一个回调,然后继续执行async function
。