我创建了一个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
我在这里做什么错了?
答案 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()
内才能使其按顺序显示...。