JavaScript:如何确保此函数只返回完全填充的数组?
我正在使用请求库。我有一个URL数组(var资源),我想用这些URL的文本内容填充它 我的代码如下所示:JavaScript:如何确保此函数只返回完全填充的数组?,javascript,asynchronous,Javascript,Asynchronous,我正在使用请求库。我有一个URL数组(var资源),我想用这些URL的文本内容填充它 我的代码如下所示: var resources = [<URL_1>, <URL_2>, <URL_3>, ...]; var resourcesText = resourceToText(resources); function resourcesToText(resources) { var text = []; for (var i in resources
var resources = [<URL_1>, <URL_2>, <URL_3>, ...];
var resourcesText = resourceToText(resources);
function resourcesToText(resources) {
var text = [];
for (var i in resources) {
request(resources[i], fetch);
}
function fetch(error, response, body) {
if (!error) {
text.push(body);
} else {
console.log('Sorry. I couldn\'t parse that resource. ' + error);
}
}
return text;
};
var资源=[,,…];
var resourcesText=resourceToText(资源);
函数resourcesToText(参考资料){
var text=[];
for(参考资料中的var i){
请求(资源[i],获取);
}
函数获取(错误、响应、正文){
如果(!错误){
文本。推送(正文);
}否则{
log('抱歉,我无法解析该资源。'+错误);
}
}
返回文本;
};
问题是resourceToText()在fetch()有时间填充数组之前返回数组。因此,resourcesText最终是空的。我假设高阶函数是用来处理这类问题的,但我不知道如何使用回调函数
解决此问题的最佳方法是什么?通过以下方式从
资源到文本创建异步函数:
使用附加回调:
function resourcesToText(resources, callback) {
var text = [],
requestCount = resources.length;
for (var i in resources) {
request(resources[i], fetch);
}
function fetch(error, response, body) {
if (!error) {
text.push(body);
} else {
console.log('Sorry. I couldn\'t parse that resource. ' + error);
}
requestCount--;
if(requestCount <= 0){
callback(text);
}
}
};
使用延期/承诺
您还可以实现延迟/承诺的概念,而不是使用回调。有许多库,例如q()可能重复使用承诺或回调。
resourcesToText(resources, function(text){
...
});