Можно ли использовать уменьшение больше длины массива? - PullRequest
1 голос
/ 28 мая 2019

Это первый раз, когда я использую уменьшение с обещанием, и оно отлично подходит для моего использования.

Однако я пытаюсь использовать сокращение, чтобы перебрать больше, чем исходный размер моего массива (вызовите Redu_array вмой пример).

На самом деле в этом примере methodThatReturnsAPromise стоит true в одном случае, false в другом.(в конце он всегда заканчивается значением false)

Идея состоит в том, что если результаты ложны, то обычно сокращают объем работы и переходят к следующему значению (nextId).С другой стороны, если результаты верны, я должен снова разрешить methodThatReturnsAPromise с тем же значением.

Я уже пробую разные методы, используя индекс в параметре, или я уже пытаюсь снова выдвинуть идентификатор в Reduce_array, ноничего из этой работы.

    reduce_array.reduce((accumulatorPromise, nextId, index, array) => {
        return accumulatorPromise.then((results) => {
            //if results === end || result === unknownDomain
            //next

            //first iteration, results don't exist
            if (results) {
                if (results === true) {
                    index++;
                    return methodThatReturnsAPromise(nextId - 1);
                } else {
                    return methodThatReturnsAPromise(nextId);
                }
            } else {
                return methodThatReturnsAPromise(nextId);
            }

        })
    }, Promise.resolve());

1 Ответ

2 голосов
/ 28 мая 2019

A do/while цикл внутри for цикла, вероятно, будет намного проще:

(async () => {
  for (const nextId of reduce_array) {
    let result;
    do {
      result = await methodThatReturnsAPromise(nextId);
    } while (result !== true);
  }
})();

Если бы вам пришлось использовать reduce, вы могли бы поместить именованную функцию, которая рекурсивно вызывает себя внутри обратного вызова reduce:

reduce_array.reduce((accumulatorPromise, nextId) => {
  return accumulatorPromise.then(() => {
    const getThisInfo = () => methodThatReturnsAPromise(nextId)
      .then((result) => (
        result === true
          ? getThisInfo()
          : null
      ));
    return getThisInfo();
  })
}, Promise.resolve());

Что немного некрасиво и не так легко читается. Я бы предпочел цикл for.

...