我有一种情况,我存储了一个包含在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将返回第一个履行值。
有没有办法将承诺重置为未履行,因此每次调用只会执行已创建的操作?
答案 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来执行另一个异步操作。它们明确地旨在防止这种情况发生。
如果这不是您想要做的,那么请更多地澄清您的问题,以便我们能够更清楚地了解您要实现的目标。