【问题标题】:Create a Javascript promise in a dormant state?在休眠状态下创建一个 Javascript 承诺?
【发布时间】:2019-01-22 00:13:44
【问题描述】:

在为某些应用程序上下文制作 Promise 时,我遇到的一个问题是希望将 Promise 中的代码的任何执行延迟到以后。当我有 manager 对象维护 Promises 集合以供以后执行时,这种情况经常发生。为了解决这个问题,我最终创建了由 manager 对象在需要执行 Promise 时调用的 builder 函数。这很乏味,并且会导致大量“boilerlate”代码。

例如,这是我的 Promise builder 函数之一:

this._buildPollingPromise = function(ethTransWaiter) {
    return new Promise(function(resolve, reject) {

        // Execute the function that builds a polling method promise.
        ethTransWaiter.confirmTransPromiseBuilder.buildPromise()
        .then(function(result) {
            ...
        })
        .then(function(ignoreResult) {
            resolve(ethTransWaiter.isConfirmed);
        })
        .catch(function(err)
        {
            // Reject the promise with the error received.
            reject(err);
        });
    });
}

必须延迟 ethTransWaiter.confirmTransPromiseBuilder.buildPromise() 方法的执行,因为如果它在创建 Promise 时执行,它将失败,因为条件尚未到位,无法成功执行。

因此,我想知道是否有内置方法或 NPM 包可以创建或帮助创建可以在休眠状态下构建的 Promise,以便函数中的代码位于 Promise 构造函数中会在稍后的某个时间执行(即 - 在您希望它执行的确切时间)这将为我节省大量样板代码。

【问题讨论】:

  • 那么,您怎么知道何时执行ethTransWaiter.confirmTransPromiseBuilder.buildPromise安全 ...您如何/何时调用_buildPollingPromise()
  • this pastebin 有帮助吗?或者更好的是this pastebin

标签: javascript promise deferred-execution


【解决方案1】:

可能是这样的?

function wait(ms) {
  return new Promise(function (resolve) {
    setTimeout(resolve, ms);
  });
}

this._buildPollingPromise = function (ethTransWaiter) {

  var waitUntilLater = wait(3000);

  var buildPromise = new Promise(function (resolve, reject) {

    // Execute the function that builds a polling method promise.
    ethTransWaiter.confirmTransPromiseBuilder.buildPromise()
      .then(function (result) {
        //...
      })
      .then(function (ignoreResult) {
        resolve(ethTransWaiter.isConfirmed);
      })
      .catch(function (err) {
        // Reject the promise with the error received.
        reject(err);
      });
  });

  return Promise.all([waitUntilLater, buildPromise]).then(function (results) {
    return results;
  });

}

【讨论】:

  • 或者你可以将等待时间移到confirmTransPromiseBuilder函数。
猜你喜欢
  • 2017-01-01
  • 2012-12-30
  • 2011-07-20
  • 2020-12-05
  • 2020-09-01
  • 2013-05-20
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多