注意:我不能使用 async
。
当我需要遍历一个数组并对其中的成员执行相同的函数并返回一个 Promise 时,我喜欢使用 reduce
模式,如下所示:
function get_count() {
return new Promise(function(resolve, reject) {
resolve(3);
});
}
function recursively_execute(data) {
return new Promise(function(resolve, reject) {
resolve(data);
});
}
function reduce_promise_pattern() {
const get_batch_run_count = get_count();
const batch_process = get_batch_run_count.then((count_value) => {
const run_count = new Array(count_value).fill('batch');
function recursive_function(data) {
console.log('Running batch!');
return recursively_execute(data).then(() => {
return data;
});
}
return run_count.reduce((previous_promise) => {
return previous_promise.then((previous_response) => {
test_data = {
'test': 1
};
return recursive_function(test_data);
})
}, Promise.resolve())
});
return batch_process;
}
run_count
构建了一个包含3个元素的数组。虽然它可以工作,但对我来说感觉像是一种欺骗。当我的列表已经预定义了唯一的项并且这些项被单独用作数据建立在那个reduce里面时,这种方法就可以工作,例如,如果我有3个步骤要完成,这3个步骤都是唯一的,每个步骤的数据都将在一个运行中使用...但在我的情况下呢?我只是让系统认为这些是不同的项目。
这方面的替代方法是什么?
reduce
的目的是什么?你想等到所有的承诺都被解决吗?因为在这种情况下,你也可以使用Promise.all()
。对每个元素执行相同的函数可以使用几乎所有迭代方法来实现,而不仅仅是reduce
。forEach
或map
也可以工作,但选择取决于你实际想要实现什么。 - 3limin4t0r