如何通过函数调用解决承诺?

时间:2019-08-16 09:24:03

标签: javascript promise es6-promise

我发现了这个承诺的代码段,可以在Promise.race()中使用该代码段,以防止等待较长的异步操作(如果我的并行代码完成得更快)。

let stopCallback = null;
const stopPromise = new Promise(x => stopCallback = x);

await stopPromise; // promise pending until stopCallback() will be executed somewhere

但是我无法完全理解此Promise的工作原理。

请,有人可以向我解释这个承诺是如何解决的,或提供任何链接到详细描述这种用例的地方吗?

3 个答案:

答案 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