Как написано, обещание doSomething
и обещание doSomethingElse
создаются в очень быстрой последовательности и разрешаются в очень быстрой последовательности через 2 секунды.
В коде нет ничего, что могло бы вызвать два процессы должны быть последовательными. Для этого вам нужно убедиться, что doSomethingElse
запускается через 2 секунды после завершения doSomething
.
Существует несколько способов организации кода, чтобы это произошло.
Например, вы можете записать выражения new Promise(...)
непосредственно в цепочку Promise, не выполняя никаких назначений:
new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('first result');
}, 2000);
})
.then(function(result) {
console.log("This is the " + result);
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('second result');
}, 2000);
});
})
.then(function(result) {
console.log("This is the " + result);
});
Или вы можете написать doSomething
и doSomethingElse
как функции:
function doSomething() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('first result');
}, 2000);
});
}
function doSomethingElse() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('second result');
}, 2000);
});
}
doSomething()
.then(function(result) {
console.log("This is the " + result);
return doSomethingElse();
})
.then(function(result) {
console.log("This is the " + result);
});
Или вы можете написать одну doSomething()
функцию и вызвать ее дважды:
function doSomething(value) {
return new Promise(function(resolve,reject) {
setTimeout(function() {
resolve(value);
},2000);
});
}
doSomething('first result')
.then(function(result) {
console.log("This is the " + result);
return doSomething('second result');
})
.then(function(result) {
console.log("This is the " + result);
});
Или, возвращаясь к doSomething()
и doSomethingElse()
в качестве отдельных функций, вы можете добавить третью logResult()
функцию для ведения журнала:
function doSomething() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('first result');
}, 2000);
});
}
function doSomethingElse() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('second result');
}, 2000);
});
}
function logResult(result) {
console.log("This is the " + result);
}
doSomething()
.then(function(result) {
logResult(result);
return doSomethingElse();
})
.then(function(result) {
logResult(result);
});
Приятной особенностью предыдущего примера является то, что цепочка Promise упростится следующим образом:
function doSomething() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('first result');
}, 2000);
});
}
function doSomethingElse() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('second result');
}, 2000);
});
}
function logResult(result) {
console.log("This is the " + result);
}
doSomething()
.then(logResult)
.then(doSomethingElse)
.then(logResult);
Как видите, уникального решения не существует.