如何在蓝鸟中实现一个满足的承诺

时间:2016-07-07 04:54:29

标签: bluebird

我有一种情况,我存储了一个包含在promise中的操作数组。现在,每次请求到达API时,它都会执行此操作。

我们说我创建了一系列操作来获取正在运行的服务的状态:

const jobs = [];

function statusRequest (url) {
  return new Promise((resolve, reject) {
    request(url, function(error, resp, body) {
      if (error) {
        return reject(error);
      }
      resolve(body);
    });
  });
}

services.forEach(url => {
  jobs.push(statusRequest(url));
});

function handler (request, reply) {
  Promise.all(jobs).then(results => {
    // handle results
  })
  .catch(error => reply(error).code(500))
}

module.exports = {
 'auth'        : false,
 'description' : 'Get the status of all the services',
 'tags'        : [ 'api', 'system', 'status' ],

  handler
};

当请求第一次到达API处理程序时,它会获取状态并将其履行值设置为该结果(缓存)。成功请求API将返回第一个履行值。

有没有办法将承诺重置为未履行,因此每次调用只会执行已创建的操作?

1 个答案:

答案 0 :(得分:-1)

  

有没有办法将承诺重置为未履行,因此每次通话都会   只执行已创建的操作?

不,你不能这样做。

要访问现有承诺的结果,您不需要取消它(这是您无法做到的事情)。您只需添加一个新的.then()处理程序即可。

听起来您可以缓存原始承诺并在其上使用新的.then()处理程序。然后,这将返回先前的结果。这是一种简单的缓存异步结果的方法。

var doSomeAPICall = (function() {
    var cachedPromise;

    return function() {
        if (!cachedPromise) {
            cachedPromise = doSomeAsyncOperation();
        }
        return cachedPromise;
    }
})();

并且,样本用法:

doSomeAPICall().then(function(data) {
    // process data here
});

// the second time, it will be using a cached result
doSomeAPICall().then(function(data) {
    // process data here
});

请记住,您始终可以向现有承诺添加更多.then()个处理程序,以便访问其已拥有或已拥有的结果。

仅供参考,你无法履行诺言。承诺是有目的的一次性装置,一旦满足或拒绝就会锁定它们的状态。您可以向其添加新的.then()处理程序以访问promise的结果,或者如果要执行新的异步操作,则可以创建新的promise。您不重用现有的promise来执行另一个异步操作。它们明确地旨在防止这种情况发生。

如果这不是您想要做的,那么请更多地澄清您的问题,以便我们能够更清楚地了解您要实现的目标。

相关问题