为时间对象事件创建异步'for of'循环

时间:2015-09-28 09:10:55

标签: javascript asynchronous promise

我有一个名为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无法帮助我:回调函数不会奇怪地调用。

我还没有理解节点的事件循环,在这些领域是相当新的。

1 个答案:

答案 0 :(得分:1)

我假设您使用的是最新节点,如果您有一个COURSE_CODES数组,您可以这样做:

Promise.all(COURSE_CODES.map(fetchCourseCode)).then(results => ...)