如何在使用array.map?

时间:2018-03-11 22:43:21

标签: node.js

我尝试做的是使用array.map后运行一个函数。从理论上讲,我应该能够在array.map之后运行。但是,出于某种原因,它在array.map完成之前运行该函数。我该如何解决?

这是我的代码。

var channelIds = channelNames.map(function (name) {
            request(`https://www.googleapis.com/youtube/v3/channels?key=${key}&forUsername=${name}&part=id`, function (error, response, body) {
                if (error) {
                    callback(error);
                } else {
                    var data = JSON.parse(body);

                    if (data.items.length == 0) {
                        callback(`Error: No channel id found for ${name}`);
                    } else {
                        return data.items[0].id;
                    }
                }
            });
        });

        function test() {
            console.log(channelIds);
        }

        test();

编辑:

建议的一种方法是使用async.map。出于某种原因,它不想像文档所说的那样运行指定的回调函数。

以下是我现在的做法。

async.map(channelNames, function (name) {
            request(`https://www.googleapis.com/youtube/v3/channels?key=${key}&forUsername=${name}&part=id`, function (error, response, body) {
                if (error) {
                    callback(error);
                } else {
                    var data = JSON.parse(body);

                    if (data.items.length == 0) {
                        callback(`Error: No channel id found for ${name}`);
                    } else {
                        return data.items[0].id;
                    }
                }
            });
        }, function (error, results) {
            console.log(results);
        });

文档:https://caolan.github.io/async/docs.html#map

1 个答案:

答案 0 :(得分:3)

在调用test方法之前如何使用Promise.all解析所有异步函数?

试试这个:

const promiseArray = channelNames.map(function (name) {
        return new Promise(function (resolve, reject) {
          request(`https://www.googleapis.com/youtube/v3/channels?key=${key}&forUsername=${name}&part=id`, function (error, response, body) {
            if (error) {
                callback(error); return reject(error);
            } else {
                var data = JSON.parse(body);

                if (data.items.length == 0) {
                    callback(`Error: No channel id found for ${name}`);
                    return reject(`Error: No channel id found for ${name}`);
                } else {
                    return resolve(data.items[0].id);
                }
            }
        });    

  });
});

Promise.all(promiseArray).then(function(channelIds) {
  console.log(channelIds);
})