Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:如何确保此函数只返回完全填充的数组?_Javascript_Asynchronous - Fatal编程技术网

JavaScript:如何确保此函数只返回完全填充的数组?

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

我正在使用请求库。我有一个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) {
  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){
  ...
});