如何执行两个承诺,但在第一个完成后返回响应

时间:2018-12-15 21:54:05

标签: node.js

我需要执行两个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))
  });

3 个答案:

答案 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的结果。