javascript - Node - 等待循环完成?

标签 javascript node.js for-loop asynchronous callback

当下面的函数完成并提供数组“albums”中项目的最终列表时,我希望它调用另一个函数/对列表做其他事情。

目前它在函数完成之前发布 [],我知道这是因为异步执行,但我认为 Node 是线性读取的,因为它是单线程的?

function getAlbumsTotal(list, params){
    for(var i = 0; i<list.length; i++){
        api.getArtistAlbums(list[i], params).then(function(data) {
            for(var alb = 0; alb<data.body.items.length; alb++){
                albums.push(data.body.items[alb].id);
            }
        }, function(err) {
            console.error(err);
        });
    }
    console.log(albums);
    //do something with the finalized list of albums here
}

最佳答案

你提供给then的回调函数确实是异步执行的,这意味着它仅在当前调用堆栈中的其余代码执行完毕后执行,包括您的最终 console.log .

这里是你如何做到的:

function getAlbumsTotal(list, params){
    var promises = list.map(function (item) { // return array of promises
        // return the promise:
        return api.getArtistAlbums(item, params)
            .then(function(data) {
                for(var alb = 0; alb<data.body.items.length; alb++){
                    albums.push(data.body.items[alb].id);
                }
            }, function(err) {
                console.error(err);
            });
    });
    Promise.all(promises).then(function () {
        console.log(albums);
        //do something with the finalized list of albums here
    });
}

注意:显然 albums被定义为全局变量。这不是一个很好的设计。最好每个 promise 都提供自己的专辑子集,并且 Promise.all call 将用于将这些结果连接到局部变量中。这是它的样子:

function getAlbumsTotal(list, params){
    var promises = list.map(function (item) { // return array of promises
        // return the promise:
        return api.getArtistAlbums(item, params)
            .then(function(data) {
                // return the array of album IDs:
                return Array.from(data.body.items, function (alb) {
                    return alb.id;
                });
            }, function(err) {
                console.error(err);
            });
    });
    Promise.all(promises).then(function (albums) { // albums is 2D array
        albums = [].concat.apply([], albums); // flatten the array
        console.log(albums);
        //do something with the finalized list of albums here
    });
}

关于javascript - Node - 等待循环完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41212249/

相关文章:

javascript - 如何为包含多个元素的数组创建 for 循环?

javascript - 基于For循环迭代的数组拼接

javascript - 请求到node.js中的其他路由

node.js - Sails mongodb 缺少连接处理

javascript - 获取所有值的数组总和中的第 n 个值

javascript - 如何监听 onclick 事件然后添加另一个 onclick 事件

javascript - jQuery inArray 不工作

javascript - 如何使用 cookie.js 的工作示例

javascript - "Phased"在javascript中执行函数

linux - 千个并发请求 - EAI_AGAIN/ECONNRESET 错误