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

时间:2017-09-29 14:15:12

标签: 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)
});

编辑:我理解调用

p1.then((v) => return v))

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

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

p2.then(function(v) {
 console.log(v)
});

成为

console.log(p1).

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

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

console.log(promise)

不会产生字符串“B”。

EDIT2:我有一种误解,认为传递给执行程序的resolve参数是未实现函数的包装器,这引起了大量的混淆。查看Why does the Promise constructor require a function that calls 'resolve' when complete, but 'then' does not - it returns a value instead?了解详情。

2 个答案:

答案 0 :(得分:12)

来自MDN documentation

  

Promise.resolve(值)

     

返回使用给定值解析的Promise对象。如果   value是一个可以(即有一个then方法),返回的promise   将"关注"那么可靠,采用其最终状态;除此以外   返回的承诺将通过该值来实现。一般来说,如果   你不知道价值是否是承诺,Promise.resolve(价值)   相反,它使用返回值作为承诺。

p1是可以的,所以返回承诺跟着它。

答案 1 :(得分:7)

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

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