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

时间:2019-01-10 09:47:56

标签: javascript node.js promise

我创建了一个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

我在这里做什么错了?

3 个答案:

答案 0 :(得分:1)

您需要在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);

答案 1 :(得分:1)

这里没问题,这是怎么回事:

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

答案 2 :(得分:0)

resolve("true")console.log()之前被调用,因为它在setTimeout()之外。

由于WriteOne()WriteFour()没有超时,因此“ 1”和“ 4”首先出现。然后1秒钟后再“ 3”,然后2。

您必须将resolve("true");放在setTimeout()内才能使其按顺序显示...。