如何从then and catch块中捆绑承诺

时间:2019-07-11 20:33:18

标签: javascript promise

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

模式如下:

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())
})

如何将responseerr传递到第二个then块中以传递给函数?

2 个答案:

答案 0 :(得分:3)

我建议在实际可用这些值的两个位置调用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())

但是,实际上我会推荐difference between .then(…, …) and .then(…).catch(…)

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

现在,如果您真的想将值传递到以下then回调中,则可以简单地return。使用数组来传输两个值:

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())

答案 1 :(得分:0)

使用async/await,它现在已包含在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 /最终都可以工作正如您所期望的那样,for循环可以像您想象的那样工作。请特别注意Array.forEach,这需要回调,因为这可能无法按您期望的方式工作。