从Promise构造函数返回值

vit*_*y-t 7 javascript promise

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

测试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);
    });
Run Code Online (Sandbox Code Playgroud)

它什么也没输出.

测试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);
    });
Run Code Online (Sandbox Code Playgroud)

它输出:

DATA: 123
VALUE: 456
Run Code Online (Sandbox Code Playgroud)

promise构造函数不能简单地解析TEST 1中的返回值有什么缺点或规范矛盾?

为什么它必须与TEST 2中的结果不同?

我试图理解构造的promise对象如何根据promise规范与可能的对象不同.

Dan*_*ite 7

传递给的函数Promise不是onFulfilled或的回调函数onRejected.MDN称之为executor.可以将其视为承诺尝试捕获的异步上下文.从异步方法返回不起作用(或有意义),因此您必须调用resolvereject.例如

var returnVal = new Promise(function() {
     return setTimeout(function() {
         return 27;
     });
});
Run Code Online (Sandbox Code Playgroud)

......不按预期工作.如果要executor在异步调用完成之前返回一个值,则无法重新解析promise.

此外,它可能是隐含return undefined;在函数末尾的隐含.考虑以相同方式运行的这些执行程序.

// A
function a() { return undefined; }

// B
function b() { }
Run Code Online (Sandbox Code Playgroud)

什么会告诉Promise构造函数你真的想解决undefined

a() === b(); // true
Run Code Online (Sandbox Code Playgroud)