是否可以使用reduce而不是数组长度?

时间:2019-05-28 10:55:18

标签: node.js promise reduce

这是我第一次使用带有reduce的reduce,对于我的用法来说,它看起来很完美。

但是,我试图使用reduce来迭代数组的原始大小(在示例中称为reduce_array)。

实际上,在此示例中,methodThatReturnsAPromise在某些情况下值得,在其他情况下值得。 (最后总是以虚假告终)

想法是,如果结果为假,则减少正常工作量,并转到下一个值(nextId)。另一方面,如果结果为真, 我必须再次解析具有相同值的methodThatReturnsAPromise。

我已经使用参数中的索引尝试了其他方法,或者我已经尝试再次在reduce_array中推送id,但是没有任何作用。

    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 个答案:

答案 0 :(得分:2)

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循环。