我希望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?了解详情。
答案 0 :(得分:12)
Promise.resolve(值)
返回使用给定值解析的Promise对象。如果 value是一个可以(即有一个then方法),返回的promise 将"关注"那么可靠,采用其最终状态;除此以外 返回的承诺将通过该值来实现。一般来说,如果 你不知道价值是否是承诺,Promise.resolve(价值) 相反,它使用返回值作为承诺。
p1
是可以的,所以返回承诺跟着它。
答案 1 :(得分:7)
解决对另一个承诺的承诺将自动使其等待另一个承诺的结果。
这使得promises可以链接(在then()
回调中返回进一步的承诺)。