将另一个承诺传递给承诺处理程序

2022-04-03 00:00:00 javascript promise es6-promise

我希望Promise处理程序记录Promisep1(不是值"A"),因为console.log是用p1直接调用的。然而,它不知何故记录了"A"。承诺p1如何在不被调用的情况下自动解析为"A"?例如,console.log(p1)并不像预期的那样直接输出"A"。幕后发生了什么事吗?

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
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()回调中返回更多承诺)。

相关文章