簡體   English   中英

從 Promise 構造函數返回值

[英]Return value from a Promise constructor

考慮下面的兩個例子......

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

它什么都不輸出。

測試 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 中的返回值的缺點或規范矛盾是什么?

為什么它必須是與 TEST 2 不同的結果?

我試圖了解根據promise 規范構造的 promise 對象與 then-able 對象有何不同。

傳遞給Promise的函數不是onFulfilledonRejected的回調。 MDN 稱它為executor 將其視為 Promise 試圖捕獲的異步上下文。 從異步方法返回不起作用(或沒有意義),因此您必須調用resolvereject 例如

var returnVal = new Promise(function() {
     return setTimeout(function() {
         return 27;
     });
});

... 沒有按預期工作。 如果您要在異步調用完成之前從executor返回一個值,則無法重新解析承諾。

此外,隱式return undefined;可能不return undefined; 在函數的最后。 考慮這些以相同方式運行的執行程序。

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

// B
function b() { }

什么會告訴Promise構造函數你真的想用undefined解析?

a() === b(); // true

值得一提的是,返回已解決的承諾有一個簡寫, Promise.resolve

return new Promise(function (resolve, reject) {
    resolve(123);
});

簡單地變成

return Promise.resolve(123);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM