简体   繁体   English

Node.js承诺链未按预期顺序触发

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

I created a simple example of a Promise chain. 我创建了一个Promise链的简单示例。 My goal is to fire the 4 functions below to get the output in Order. 我的目标是触发以下4个函数以按顺序获取输出。 ie 1 2 3 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);

When I execute them, they are firing in this order: 当我执行它们时,它们按以下顺序触发:

1 4 3 2

What am I doing wrong here? 我在这里做错了什么?

You need to resolve inside setTimeout callback 您需要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); 

Nothing wrong here, here what's happening: 这里没问题,这里发生了什么:

// 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

Thus the output. 因此输出。

To get the result you're expecting, resolve the promise inside the setTimeout. 为了获得您期望的结果,请在setTimeout中解析promise。

resolve("true") is called before the console.log() because it's outside the setTimeout() . console.log()之前调用resolve("true")因为它在setTimeout()

Since WriteOne() and WriteFour() have no timeout, "1" and "4" appear first. 由于WriteOne()WriteFour()没有超时,因此“ 1”和“ 4”首先出现。 Then "3" 1 second later, Then 2. 然后在1秒钟后“ 3”,然后2。

You have to put resolve("true"); 您必须输入resolve("true"); inside setTimeout() in order to have them appear... in order. setTimeout()里面以便使它们按顺序出现。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM