考虑以下两个例子......
function test1() {
return new Promise(function () {
return 123;
});
}
test1()
.then(function (data) {
console.log("DATA:", data);
return 456;
})
.then(function (value) {
console.log("VALUE:", value);
});
它什么都不输出。
function test2() {
return new Promise(function (resolve, reject) {
resolve(123);
});
}
test2()
.then(function (data) {
console.log("DATA:", data);
return 456;
})
.then(function (value) {
console.log("VALUE:", value);
});
输出:
DATA: 123
VALUE: 456
承诺构造函数不能简单地解析TEST 1中的返回值有什么缺点或spec矛盾?
为什么它必须与TEST 2中的结果不同?
我正在尝试理解构造的promise对象与promise spec的可用对象的不同之处。
答案 0 :(得分:7)
传递给Promise
的功能不是onFulfilled
或onRejected
的回调。 MDN将其称为executor
。可以将其视为承诺尝试捕获的异步上下文。从异步方法返回并不起作用(或有意义),因此您必须致电resolve
或reject
。例如
var returnVal = new Promise(function() {
return setTimeout(function() {
return 27;
});
});
...不按预期工作。如果您在异步调用完成之前从executor
返回值,则无法重新解析承诺。
此外,在函数末尾隐式return undefined;
可能是不明显的。考虑一下以相同方式运行的执行器。
// A
function a() { return undefined; }
// B
function b() { }
什么会告诉Promise
构造函数你真的想用undefined
来解决?
a() === b(); // true
答案 1 :(得分:2)
值得一提的是,有一个简短的回复已解决的承诺Promise.resolve。
return new Promise(function (resolve, reject) {
resolve(123);
});
简单地变成
return Promise.resolve(123);