我尝试做的是使用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);
});
答案 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);
})