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

kua*_*uan 13 javascript promise es6-promise

我希望promise处理程序能够记录promise p1(而不是值"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)
});
Run Code Online (Sandbox Code Playgroud)

编辑:我明白,打电话

p1.then((v) => return v))
Run Code Online (Sandbox Code Playgroud)

返回一个用值v实现的新promise.除非我在这里严重遗漏了某些东西,否则第二个promise构造函数中的"p1"引用应该直接传递给console.log,从而产生块

var p2 = new Promise(function(resolve, reject) {
  resolve(p1);
});

p2.then(function(v) {
 console.log(v)
});
Run Code Online (Sandbox Code Playgroud)

变得

console.log(p1).
Run Code Online (Sandbox Code Playgroud)

由于使用p1直接调用console.log,而不是p1.then(...)的结果,因此p1不应该像打印另一个程序一样解析为值"A"

var promise = new Promise(function(resolve, reject) {
  resolve("B")
})

console.log(promise)
Run Code Online (Sandbox Code Playgroud)

不会产生字符串"B".

编辑2:我有一种误解,认为传递给执行程序的resolve参数是未实现函数的包装器,这引起了大量的混淆.检查为什么Promise构造函数需要一个在完成时调用'resolve'的函数,但'then'却没有 - 它返回一个值而不是?更多细节.

Que*_*tin 12

MDN文档:

Promise.resolve(值)

返回使用给定值解析的Promise对象.如果该值是一个可设置的(即具有then方法),则返回的promise将"跟随"那个可能的,采用其最终状态; 否则返回的承诺将通过该值来实现.通常,如果您不知道某个值是否为promise,则Promise.resolve(value)代替它并将返回值作为promise.

p1 是可以的,所以回报承诺遵循它.

  • 但是,在Proms代码中没有调用`Promise.resolve` (4认同)
  • @Redu 是的,“基本上”。但是 OP 可能不知道这一点,并且在答案中没有明确说明。 (2认同)

SLa*_*aks 7

解决对另一个承诺的承诺将自动使其等待另一个承诺的结果.

这使得promises可以链接(在then()回调中返回进一步的承诺).