代码之家  ›  专栏  ›  技术社区  ›  Bluemarble

node.js promise chain未按所需顺序触发

  •  1
  • Bluemarble  · 技术社区  · 7 年前

    我创建了一个简单的承诺链示例。我的目标是启动下面的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
    

    我在这里做错什么了?

    3 回复  |  直到 7 年前
        1
  •  1
  •   ponury-kostek    7 年前

    你需要 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);
        2
  •  1
  •   Nino Filiu    7 年前

    这里没什么问题,这里发生了什么:

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

    因此输出。

    要获得预期的结果,请在设置时间内解决承诺。

        3
  •  0
  •   Martial    7 年前

    resolve("true") console.log() 因为它在外面 setTimeout() .

    自从 WriteOne() WriteFour() 没有超时,“1”和“4”首先出现。然后“3”1秒后,然后是2。

    你必须把 resolve("true"); 里面 设置TimeTo() 为了让他们出现…整齐。