Javascript 如何捆绑来自then and catch block的承诺
我正在尝试将来自API请求的数据链接在一起,并希望将其中两个块的承诺收集到第三个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
中,然后
模式如下:
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第三个例子正是您所需要的!