我有一个for循环,其中每个迭代运行一个promise,如果promise被解析,则将promise的索引添加到数组中,最后,我想输出结果数组。但是,该函数在完成for循环中的所有promise之前一直返回数组。结果,我总是得到一个空的返回数组。
我的代码如下所示:
var str_list = [some strings];
let myFunction = () => {
var array = [];
for (i = 0; i < length; i++) {
new Promise((resolve, reject) => {
if (str_list[i] fulfills some conditions) {
resolve();
} else {
reject(
throw new Error())
}
}).then(() => {
array.push(i);
}).catch((err) => {
console.log(i, err);
});
}
return array;
}
有没有一种好方法可以在返回值之前等待for循环完成?
答案 0 :(得分:1)
var str_list = ["..."];
let myFunction = async () =>
{
const promises = [];
for (i = 0; i < length; i++)
{
promises.push(new Promise((resolve, reject) =>
{
const condition = // ...
resolve(condition ? str_list[i] : false);
}));
}
return (await Promise.all(promises)).filter(f => f !== false);
}
&#13;
试试这个。从本质上讲,它的作用是将所有Promises添加到数组中,然后在它们上调用Promise.all
,它们并行执行它们并等待它们全部完成。
然后按顺序返回结果,这些结果是传递到每个resolve()
的{{1}}函数的结果,并且可以是Promise
或str_list[i]
。然后,对false
的调用将删除所有filter()
条目。
如果你关心简洁,那么这可以大大简化:
false
&#13;
此代码与第一个代码段的工作方式相同;它的时间要短得多。
我制作了var str_list = ["..."];
let myFunction = async () =>
{
const promises = str_list.map(async (value, index) => condition ? value : false);
return (await Promise.all(promises)).filter(f => f !== false);
}
方法,因为没有async
没有Promise
就无法返回await
的结果。如果您不想使用async
方法,则可以返回Promise
,然后可以使用await
或.then()
等待1}}
var str_list = ["..."];
let myFunction = () => {
const promises = [];
for (i = 0; i < length; i++) {
promises.push(new Promise((resolve, reject) => {
const condition = // ...
resolve(condition ? str_list[i] : false);
}));
}
return Promise.all(promises).then(strs => strs.filter(f => f !== false));
}
// myFunction().then(results => ...)
&#13;
或者你可以使用回调:
var str_list = ["..."];
let myFunction = (callback) =>
{
const promises = [];
for (i = 0; i < length; i++)
{
promises.push(new Promise((resolve, reject) =>
{
const condition = // ...
resolve(condition ? str_list[i] : false);
}));
}
return Promise.all(promises).then(results => callback(results.filter(f => f !== false));
}
// myFunction(results => ...);
&#13;