20

promise の配列を含む配列があり、各内部配列には 4k、2k、または 500 個の promise があります。

合計で約 60,000 個の promise があり、他の値でもテストできます。

を実行する必要がありPromise.all(BigArray[0])ます。

最初の内部配列が完成したら、次の配列を実行する必要がありPromise.all(BigArray[1])ます。

実行しようとすると、Promise.all(BigArray)スローされます:

fatal error call_and_retry_2 allocation failed - process out of memory

私はそれを並行してではなく、一連の約束のそれぞれを実行する必要があります。これは、ノードが行っていることだと思います。新しいライブラリを使用するべきではありませんが、答えを検討したいと思います!.

編集:

コードの例を次に示します。

function getInfoForEveryInnerArgument(InnerArray) {
    const CPTPromises = _.map(InnerArray, (argument) => getDBInfo(argument));
    return Promise.all(CPTPromises)
        .then((results) => {
            return doSomethingWithResults(results);
        });
}
function mainFunction() {
    BigArray = [[argument1, argument2, argument3, argument4], [argument5, argument6, argument7, argument8], ....];
    //the summ of all arguments is over 60k...
    const promiseArrayCombination = _.map(BigArray, (InnerArray, key) => getInfoForEveryInnerArgument(InnerArray));

    Promise.all(promiseArrayCombination).then((fullResults) => {
        console.log(fullResults);
        return fullResults;
    })
}
4

6 に答える 6

3

@ jfriend00async/await with を使用して回答に追加するだけreduceです:

function runPromisesInSeries(bigArray, getInfoForEveryInnerArgument) {
  try {
    return bigArray.reduce(async (acc, cItem) => {
      const results = await acc
      const data = await getInfoForEveryInnerArgument(cItem)
      results.push(data)
      return results
    }, Promise.resolve([]))
  } catch (err) {
    throw err
  }
}
于 2018-10-19T09:19:15.303 に答える
0

再帰的に行うことができます。たとえば、ここでは mongo に約 60k のドキュメントを配置する必要がありましたが、大きすぎて 1 ステップで実行できませんでした。別の 1k ドキュメントなど

exports.rawRecursive = (arr, start) => {
        //ending condition
        if (start > arr.length) {
            return;
        }

        Rawmedicament.insertManyAsync(_.slice(arr, start, start + 1000)).then(() => {
            //recursive
            exports.rawRecursive(arr, start + 1000);
        });
};

通知したい場合は、すべてが完了したら、終了条件でコールバックを配置するか、Promise が好きな場合はそこで resolve() を呼び出すことができます。

于 2016-05-13T15:07:58.493 に答える