Node.js Цепочка обещаний не стреляет в нужном порядке - PullRequest
0 голосов
/ 10 января 2019

Я создал простой пример цепочки 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 голосов
/ 10 января 2019

Здесь все в порядке, вот что происходит:

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

0 голосов
/ 10 января 2019

resolve("true") вызывается перед console.log(), потому что это вне setTimeout().

Поскольку WriteOne() и WriteFour() не имеют времени ожидания, «1» и «4» появляются первыми. Затем «3» через 1 секунду, затем 2.

Вы должны поместить resolve("true"); внутрь setTimeout(), чтобы они появились ... в порядке.

0 голосов
/ 10 января 2019

Вам нужно 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...