我有一些返回承诺的函数。
有一个启动功能可以执行另一个功能。
由于这些是承诺,因此我使用Promise.all,从理论上讲,Promise.all
仅在所有其他承诺都完成后才显示。
代码如下:
arr = [];
function start() {
var aPromiseMain = new Promise((resolve, reject) => {
myfunction();
arr.push('start');
resolve(console.log('I am start'))
})
return aPromiseMain
}
start();
function myfunction() {
var aPromise = new Promise((resolve, reject) => {
setTimeout(() => {
arr.push('I am myfunction');
resolve(console.log('I am myfunction'))
}, 2000)
})
return aPromise
}
Promise.all(arr).then(values => {
console.log(values);
});
所发生的是顺序如下:
myfunction
应该是:
myfunction
我该如何解决?
答案 0 :(得分:3)
您的数组应该是 promises 的数组,而不是字符串的数组。
arr = [];
function start() {
var aPromiseMain = new Promise((resolve, reject) => {
resolve('I am start')
})
return aPromiseMain
}
function myfunction() {
var aPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('I am myfunction')
}, 2000)
})
return aPromise
}
arr.push(start());
arr.push(myfunction());
Promise.all(arr).then(values => {
console.log(values);
console.log("I am done");
});
答案 1 :(得分:1)
例如,您的代码arr.push('start');
仅向该数组添加一个字符串。 Promise.all需要访问实际的Promise对象,而不是字符串。它不能对字符串做任何有用的事情。将console.log
的结果作为值发送到resolve
函数也没有意义-此参数的想法是作为结果返回给侦听器一些信息-console.log记录了事情,但是不返回数据。
此示例将Promise对象推入数组,以便Promise.all在执行之前等待每个对象完成,并在Promise解析时发送有意义的响应。
arr = [];
function start() {
var aPromiseMain = new Promise((resolve, reject) => {
console.log("start");
myfunction();
resolve('I am start');
});
arr.push(aPromiseMain);
return;
}
start();
function myfunction() {
var aPromise = new Promise((resolve, reject) => {
setTimeout(() => {
console.log("myfunction");
resolve('I am myfunction');
}, 2000)
})
arr.push(aPromise);
return;
}
Promise.all(arr).then(values => {
console.log(values);
});
答案 2 :(得分:1)
从作者的描述和评论看来,他们可能需要按顺序履行承诺,所以这里有一个替代方案:
arr = [];
function start() {
console.log("I have started");
var aPromiseMain = new Promise((resolve, reject) => {
myfunction().then((result) => {
console.log('I am finished');
});
})
return aPromiseMain
}
function myfunction() {
var aPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(console.log('I am myfunction'))
}, 2000)
})
return aPromise
}
start();
答案 3 :(得分:-2)
function start() {
return new Promise((resolve, reject) => {
myfunction();
arr.push('start');
resolve(console.log('I am start'))
})
}
function myfunction() {
return new Promise((resolve, reject) => {
setTimeout(() => {
arr.push('I am myfunction');
resolve(console.log('I am myfunction'))
}, 2000)
})
}
var arr = [start(), myfunction()]
Promise.all(arr).then(values => {
console.log(values);
});
尝试一下。