这是我第一次使用带有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());
答案 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
循环。