将另一个承诺传递给承诺处理程序
我希望Promise处理程序记录Promisep1
(不是值"A"),因为console.log
是用p1
直接调用的。然而,它不知何故记录了"A"。承诺p1
如何在不被调用的情况下自动解析为"A"?例如,console.log(p1)
并不像预期的那样直接输出"A"。幕后发生了什么事吗?
var p1 = new Promise(function(resolve, reject) {
resolve("A");
});
var p2 = new Promise(function(resolve, reject) {
resolve(p1);
});
p2.then(function(v) {
console.log(v)
});
编辑:我理解呼叫
p1.then((v) => return v))
返回一个用v值实现的新Promise,除非我在这里严重遗漏了一些东西,否则第二个Promise构造函数中的"p1"引用应该直接传递给sole.log,从而导致块
var p2 = new Promise(function(resolve, reject) {
resolve(p1);
});
p2.then(function(v) {
console.log(v)
});
成为
console.log(p1).
由于使用p1而不是p1的结果直接调用console.log,因此不应像打印另一个程序那样将p1解析为值"A"
var promise = new Promise(function(resolve, reject) {
resolve("B")
})
console.log(promise)
不会产生字符串"B"。
EDIT2:我有一个误解,以为传递给Executor的Resolve参数是未完成函数的包装,这给我带来了极大的困惑。有关详细信息,请查看Why does the Promise constructor require a function that calls 'resolve' when complete, but 'then' does not - it returns a value instead?。
解决方案
将一个承诺解析为另一个承诺将自动使其等待另一个承诺的结果。
这就是承诺可链接的原因(在then()
回调中返回更多承诺)。
相关文章