我需要执行两个Promise(例如,将文档保存到Cloudant上,例如,实际上没有关系)。但是我需要在第一个承诺完成后立即发送http响应,而不必等待另一个。现在,我们不在乎另一个承诺是成功还是失败。这是我的工作:
let promise1 = saveDocument(data1);
let promise2 = saveDocument(data2);
promise1
.then((response) => {
promise2.then().catch();
resp.status(200).send(JSON.stringify(response))
})
.catch((err) => {
resp.status(500).send(JSON.stringify(err.message))
})
这不是正确的方法吗?这是原始代码:
promise1
.then((response) => {
promise2.then((response) => {
resp.status(200).send(JSON.stringify(response))
}).
.catch((err) => {
resp.status(500).send(JSON.stringify(err.message))
});
})
.catch((err) => {
resp.status(500).send(JSON.stringify(err.message))
});
答案 0 :(得分:0)
看看Promise.race()。一旦两个承诺之一解决或拒绝,它就会解决或拒绝。
如果您只想解决第一个成功的诺言,请查看bluebird's Promise.any或编写自己的实现。
答案 1 :(得分:0)
您想要的是Promise.race Api,到目前为止,我知道所有浏览器都支持。
您需要的是这个
let promise1 = saveDocument(data1);
let promise2 = saveDocument(data2);
// Both promises will be executed at the same time.
Promise.race([promise1, promise2]).then((response) => {
// Both will be resolved, but the first one is the one that you get here.
resp.status(200).send(JSON.stringify(response))
});
我不太了解500和200的逻辑,但是也可以做到这一点:
Promise.race([promise1, promise2]).then((response) => {
// Only call if the first promise win.
resp.status(200).send(JSON.stringify(response))
}, (response) => {
// Only call if the second promise win.
resp.status(500).send(JSON.stringify(response))
});
在第二种方法中,您可以回答许许多多的承诺,就像对承诺的可迭代性所做的承诺一样。
希望这对您有帮助!
答案 2 :(得分:0)
从这个问题看来,您似乎只想听第一个诺言,只有在那个诺言失败时才会失败,第二个诺言可以自行通过或失败。如果是这样,您的解决方案就已经存在了。
let promise1 = saveDocument(data1);
let promise2 = saveDocument(data2);
promise1
.then(response => {
resp.status(200).send(JSON.stringify(response))
})
.catch(err => {
resp.status(500).send(JSON.stringify(err.message))
})
这两个诺言都会被启动,并且两个诺言都将彼此独立地拒绝或失败,但是您只是在听promise1的结果。