从Promise构造函数

时间:2015-09-25 10:41:06

标签: javascript promise

考虑以下两个例子......

TEST 1

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);
    });

它什么都不输出。

TEST 2

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的可用对象的不同之处。

2 个答案:

答案 0 :(得分:7)

传递给Promise的功能不是onFulfilledonRejected的回调。 MDN将其称为executor。可以将其视为承诺尝试捕获的异步上下文。从异步方法返回并不起作用(或有意义),因此您必须致电resolvereject。例如

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);