如何在返回值之前等待for循环中的promise

时间:2018-05-23 23:50:32

标签: javascript arrays for-loop

我有一个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循环完成?

1 个答案:

答案 0 :(得分:1)

&#13;
&#13;
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;
&#13;
&#13;

试试这个。从本质上讲,它的作用是将所有Promises添加到数组中,然后在它们上调用Promise.all,它们并行执行它们并等待它们全部完成。

然后按顺序返回结果,这些结果是传递到每个resolve()的{​​{1}}函数的结果,并且可以是Promisestr_list[i]。然后,对false的调用将删除所有filter()条目。

如果你关心简洁,那么这可以大大简化:

&#13;
&#13;
false
&#13;
&#13;
&#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()等待

&#13;
&#13;
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;
&#13;
&#13;

或者你可以使用回调:

&#13;
&#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;
&#13;
&#13;