Javascript 如何捆绑来自then and catch block的承诺

Javascript 如何捆绑来自then and catch block的承诺,javascript,promise,Javascript,Promise,我正在尝试将来自API请求的数据链接在一起,并希望将其中两个块的承诺收集到第三个中,然后 模式如下: sql.connect(config.properties).then(pool => { return pool.request() .execute('stored_proc') .then(response => { res.send(response) }) .catch(err => { res.send(err) }) .then

我正在尝试将来自API请求的数据链接在一起,并希望将其中两个块的承诺收集到第三个
中,然后

模式如下:

sql.connect(config.properties).then(pool => {
  return pool.request()
    .execute('stored_proc')
    .then(response => { res.send(response) })
    .catch(err => { res.send(err) })
    .then((response, err) => { someFunction(response, err) }) // bundle here
    .finally(() => sql.close())
})

如何将
响应
错误
传递到第二个
中,然后
块传递到函数中?

使用Node.js中包含的
异步/等待

您可以这样做->

sql.connect(config.properties).then(async pool => {
  try {
    let response = null; //let's set to null, in case it doesn't even get that far
    try {
      response = await pool.request().execute('stored_proc');
      res.send(response);
      someFunction(response, null);
    } catch (err) {
      res.send(err);
      someFunction(response, err);
    }
  } finally {
    sql.close();
  }
})
这里的优点是我们可以在响应上保留一个闭包,我也将它设置为null,因为在理论上它甚至可能无法得到响应


是什么让
async/await
做得很好,你可以回到
sync
的思维方式,但是代码仍然运行
async
,所以所有正常的try/catch/finally都能像你预期的那样工作,因为循环可以像你想象的那样工作等等。只要小心
Array.forEach
,以及需要回调的东西,因为这可能无法按您期望的方式工作。

我建议在实际可用这些值的两个位置调用
someFunction

return pool.request()
.execute('stored_proc')
.then(response => {
  res.send(response);
  someFunction(response, null);
})
.catch(err => {
  res.send(err);
  someFunction(null, err);
})
.finally(() => sql.close())
然而,考虑到实际情况,我会推荐

return pool.request()
.execute('stored_proc')
.then(response => {
  res.send(response);
  someFunction(response, null);
}, err => {
  res.send(err);
  someFunction(null, err);
})
.finally(() => sql.close())
现在,如果您确实想将这些值传递到下面的
回调中,那么您可以简单地
返回它们。使用数组传输两个值:

return pool.request()
.execute('stored_proc')
.then(response => {
  res.send(response);
  return [response, null];
}, err => {
  res.send(err);
  return [null, err];
})
.then(([response, err]) => {
  someFunction(response, err);
})
.finally(() => sql.close())

我不确定为什么
err
出现在您的
then
中。要返回响应,请执行以下操作:
.then((response,err)=>{someFunction(response,err);return response;})
您可以使用
异步/await
,如果您不使用非常旧版本的node,那么这里的答案是肯定的。
异步/await
的一个优点是,您有闭包的好处,如果没有闭包,您将不得不将所有内容传递到承诺链。@Santi理论上执行可以成功,但是res.send可以失败,因此您可能会有响应和错误。@Keith理解,谢谢。使用
someFunction
我想将
response
err
传递到日志…OP还想在没有错误的情况下调用
someFunction
?我得到一个
wait仅在异步函数中有效此示例中出现错误。啊,我现在明白了!!谢谢你的帮助!!:)你的第一个例子是我最初的例子,但我正在努力清理代码…第二个例子看起来很有希望,但我需要仔细阅读
然后(…,…)
然后(…)之间的细微差别。抓住(…)
。第三个非常符合这个问题的精神,但是在语法上有点重。@Matthew第三个例子正是您所需要的!