我正在查看Angular文档中$q的例子,但我认为这可能适用于一般的承诺。下面的例子是从他们的文档中逐字复制的,包括他们的评论:
promiseB = promiseA.then(function(result) {
return result + 1;
});
// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1
我不清楚这是怎么回事。如果我可以对第一个.then()的结果调用.then(),将它们链接起来,我知道我可以,那么promiseB是一个promise对象,类型为object。它不是一个数字。那么“它的值将是承诺a加1的结果”是什么意思呢?
我应该像承诺的那样访问吗?。价值或类似的东西?如何成功回调返回承诺和返回“结果+ 1”?我遗漏了一些东西。
在Node.js REPL中,为了获得一个承诺值的数据库连接,我采用了以下方法:
let connection
try {
(async () => {
connection = await returnsAPromiseResolvingToConnection()
})()
} catch(err) {
console.log(err)
}
带有await的行通常会返回一个promise。这段代码可以粘贴到Node.js的REPL中,或者保存在index.js中。它可以在Bash中运行
node -i -e "$(< index.js)"
这让你在运行脚本访问set变量后留在Node.js REPL中。例如,要确认异步函数已经返回,可以记录连接,然后就可以使用该变量了。当然,对于异步函数之外的脚本中的任何代码,人们都不希望依赖于异步函数被解析。
当在交互式提示符下进行实验时,可以通过在"then()"函数中将值赋给全局变量来访问Promise的值,例如:
> promise = new Promise((resolve, reject) => resolve(17));
Promise {
17,
[Symbol(async_id_symbol)]: 7600,
[Symbol(trigger_async_id_symbol)]: 5,
[Symbol(destroyed)]: { destroyed: false }
}
> global_cheat = null;
null
> promise.then((v) => { global_cheat = v; } );
Promise {
<pending>,
[Symbol(async_id_symbol)]: 7875,
[Symbol(trigger_async_id_symbol)]: 7600,
[Symbol(destroyed)]: { destroyed: false }
}
> global_cheat
17
在代码中,这种想法似乎总是迫使人们将“跟进”代码放入“then()”部分(或者,等效地,如果我理解的话,放入async/await模式,如果我理解的话,它再次被重写为“then()”模式)。我想这个想法是为了防止“阻塞”系统,尽管在我看来不提供同步获取值的后门对语言设计者来说太家长式了。
注意,还是从交互式命令行:
> xyz=null; promise.then((v) => {xyz = v;}); console.log(`xyz=${xyz}`);
xyz=null
这是因为“then()”中的代码还没有运行。
然而,在“下一行”(在交互提示符处),你可以这样做:
> xyz
17
当一个promise被解决/拒绝时,它将调用它的成功/错误处理程序:
var promiseB = promiseA.then(function(result) {
// do something with result
});
then方法还返回一个promise: promiseB,它将根据来自promiseA的成功/错误处理程序的返回值被解析/拒绝。
有三个可能的值,promise的成功/错误处理程序可以返回,将影响promise的结果:
什么都不回→承诺立即解决,
undefined被传递给promise eb的成功处理程序
返回一个值→立即解析promise,
并将该值传递给promiseB的成功处理程序
返回承诺→当解决时,承诺将被解决。
当被拒绝时,承诺将被拒绝。传递给
promise的处理程序将是promise的结果
有了这样的理解,你就可以理解以下内容:
promiseB = promiseA.then(function(result) {
return result + 1;
});
然后调用立即返回promiseB。
当promise ea被解析时,它将把结果传递给promise ea的成功处理程序。
由于返回值是许诺ea的结果+ 1,成功处理程序返回一个值(上面的选项2),因此许诺eb将立即解析,许诺eb的成功处理程序将被传递许诺ea的结果+ 1。