我有一个名为fetchCourseCode(string)
的函数,它从Web服务器获取一些信息并将它们存储到数组中。我还有〜135个课程代码(字符串),应该在相同时间段的离散时间内获取。
通常,在非异步情况下,代码应为:
for (eachCode of COURSE_CODES) {
fetchedInformationArray.push(fetchCourseCode(eachCode));
}
但是,由于这是一个时间操作, node.js 事件循环转义为fetchCourseCode()
的返回,我们什么都没有(undefined
的数组)最后。
所以我尝试使用 async
的forEachOf
函数来迭代数组,并手动构建了对fetchCourseCode()
函数的声明:
async.forEachOf(kCOURSE_CODES, function(value, key, callback) {
console.log("fetched " + value);
fetchCourseCode(value).then(response) {
schedule[key] = response;
callback();
}, function(error) {
callback(error);
});
}, function(error) {
if (error) {
console.error(error);
} else {
console.log("Fetched schedule: " + JSON.stringify(schedule));
}
});
不幸的是,我发现使用嵌套的promises是一种反模式。
我 - 正在考虑 - 无法使用Q.all()
,因为功能列表是动态变化的。另外,async.map
无法帮助我:回调函数不会奇怪地调用。
我还没有理解节点的事件循环,在这些领域是相当新的。
答案 0 :(得分:1)
我假设您使用的是最新节点,如果您有一个COURSE_CODES
数组,您可以这样做:
Promise.all(COURSE_CODES.map(fetchCourseCode)).then(results => ...)