刚接触promises,研究过。所以我的代码和我的理解:
sql.connect(config).then(function(connection) {
return connection.request().query('select * from Users')
}).then(function(result) {
console.dir(result);
res.send(result);
}).catch((err) => {
console.log(err);
res.send(err)
});
}) // extra?
在第一行中,connect
方法返回一个 promise,因此当我调用函数 then
(如果连接成功 ). then
接受回调,即“successCB”、“failureCB”作为参数,这些参数实际上表示 connect
promise 返回的结果或错误。正确吗?
此外,“successCB”正在返回 promise (来自 .query
)。
then
再次调用 then
返回的先前 promise 。
在 then
用于 connect()
的情况下,为什么 then
接受回调以及它如何知道 connect
是否成功,因为 connect
已经返回了结果,即“successCB”?
最佳答案
我不能 100% 确定您是否正确,但这就是我的解释方式。假设我们有一个 promise A。
- 调用
then()
总是 返回一个新的 promise (我们称它为 B) - 如果回调返回 promise C,则 promise B 将解决或失败,并返回 promise C 的结果。
- 如果任何回调返回非 promise 值 X,则 promise B 将解析为值 X
- 如果在回调中抛出异常,则 promise B 将因异常而失败。
- 如果主 promise A 失败,并且没有给出失败回调,则 promise B 也会失败并出现相同的错误。
我个人觉得学习这个非常困惑,因为它需要相当复杂的心智模型才能完全掌握。我完全理解这一点的那一天就是我编写自己的 Promise
类的那一天。我会建议任何完全想在每个细节中把握 promise 的人花时间去做这件事。
关于javascript - then() 函数是否返回反射(reflect)先前 promise 结果的 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54715051/