簡體   English   中英

Node.js承諾鏈未按預期順序觸發

[英]Node.js Promise Chain not firing in desired order

我創建了一個Promise鏈的簡單示例。 我的目標是觸發以下4個函數以按順序獲取輸出。 即1 2 3 4。

function WriteOne()
{
    return new Promise(function(resolve, reject)
    {
        console.log("1");
        resolve("true");
    })    
}

function WriteTwo()
{
    return new Promise(function(resolve, reject)
    {
        setTimeout(function(){console.log("2");}, 3000);
        resolve("true");
    })    
}

function WriteThree()
{
    return new Promise(function(resolve, reject)
    {
        setTimeout(function(){console.log("3");}, 1000);
        resolve("true");
    })
}

function WriteFour()
{
    return new Promise(function(resolve, reject)
    {
        console.log("4");
        resolve("true");
    }) 
}

WriteOne().then(WriteTwo).then(WriteThree).then(WriteFour);

當我執行它們時,它們按以下順序觸發:

1 4 3 2

我在這里做錯了什么?

您需要resolve setTimeout回調內部

 function WriteOne() { return new Promise(function (resolve, reject) { console.log("1"); resolve("true"); }); } function WriteTwo() { return new Promise(function (resolve, reject) { setTimeout(function () { console.log("2"); resolve("true"); }, 3000); }); } function WriteThree() { return new Promise(function (resolve, reject) { setTimeout(function () { console.log("3"); resolve("true"); }, 1000); }); } function WriteFour() { return new Promise(function (resolve, reject) { console.log("4"); resolve("true"); }); } WriteOne().then(WriteTwo).then(WriteThree).then(WriteFour); 

這里沒問題,這里發生了什么:

// t=0s
writeOne()
// 1 is logged
// promise is resolved
.then(writeTwo)
// in 3s, 2 will be logged
// promise is resolved
.then(writeThree)
// in 1s, 3 will be logged
// promise is resolved
.then(writeFour)
// 4 is logged

// t=1s
// 3 is logged

// t=3s
// 2 is logged

因此輸出。

為了獲得您期望的結果,請在setTimeout中解析promise。

console.log()之前調用resolve("true")因為它在setTimeout()

由於WriteOne()WriteFour()沒有超時,因此“ 1”和“ 4”首先出現。 然后在1秒鍾后“ 3”,然后2。

您必須輸入resolve("true"); setTimeout()里面以便使它們按順序出現。

暫無
暫無

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

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