我正在尝试将来自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())
})
如何将response
和err
传递到第二个then
块中以传递给函数?
答案 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
,这需要回调,因为这可能无法按您期望的方式工作。