Bluebird 如何在《蓝鸟》中兑现承诺

Bluebird 如何在《蓝鸟》中兑现承诺,bluebird,Bluebird,我有一种情况,即我存储了一个封装在承诺中的操作数组。现在,每次请求到达API时,它都会执行此操作 假设我创建了一系列操作来获取正在运行的服务的状态: const jobs=[]; 函数状态请求(url){ 返回新承诺((解决、拒绝){ 请求(url、函数(错误、响应、正文){ 如果(错误){ 返回拒绝(错误); } 决议(机构); }); }); } services.forEach(url=>{ jobs.push(statusRequest(url)); }); 函数处理程序(请求、回复){

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

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

const jobs=[];
函数状态请求(url){
返回新承诺((解决、拒绝){
请求(url、函数(错误、响应、正文){
如果(错误){
返回拒绝(错误);
}
决议(机构);
});
});
}
services.forEach(url=>{
jobs.push(statusRequest(url));
});
函数处理程序(请求、回复){
承诺。所有(工作)。然后(结果=>{
//处理结果
})
.catch(error=>reply(error).code(500))
}
module.exports={
“auth”:错误,
'description':'获取所有服务的状态',
“标记”:[“api”、“系统”、“状态”],
处理者
};
当请求第一次命中API处理程序时,它获取状态并将其值设置为该结果(缓存)。对API的后续请求将返回第一个实现值

是否有办法将承诺重置为未实现,以便每个调用只执行已创建的操作

有没有办法将承诺重置为未实现,这样每次通话都会 只是执行已经创建的操作

不,你不能这样做

要获得现有承诺的结果,您不需要不履行它(这是您无论如何都不能做的事情)。您只需添加一个新的
。然后()
处理程序即可

听起来您可以缓存原始承诺并在其上使用新的
.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()
处理程序以访问承诺的结果,或者如果您想要执行新的异步操作,您可以创建一个新的承诺。您不能重用现有承诺来执行另一个异步操作。它们的明确设计是为了防止这种情况



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

1。二号。这是一个明显的XY问题:解释你正在尝试做什么,而不是你如何尝试去做,并显示你的代码没有达到你想要的。让我们把你的要求从DDD翻译成英语。“我不想每次都想做工作,但我想让事情发生。”手术是对正在做的工作的隐喻。履行
承诺
就是“完成”这项工作。尽管这在技术上是可能的(JS中任何事情都是可能的)。这样做是最糟糕的想法。因为它没有逻辑、语法或设计意义。我向你保证,下一个开发你的代码的开发人员“他会找你,他会找到你,他会杀了你”。为什么投反对票?这似乎回答了OP想要实现的目标。@James-这有助于回答你的问题吗?