Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.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_Arrays_For Loop_Promise - Fatal编程技术网

Javascript 串联运行阵列中的承诺

Javascript 串联运行阵列中的承诺,javascript,arrays,for-loop,promise,Javascript,Arrays,For Loop,Promise,我有一个链接数组,但是像这样并行执行它们会使服务器挂起并超时 var pages = linksArray.then(function(arr){ return arr.map(function(link) { return loader(link); }); }).then(function(data){ console.log(data); return dat

我有一个链接数组,但是像这样并行执行它们会使服务器挂起并超时

var pages = linksArray.then(function(arr){
    return arr.map(function(link) {
              return loader(link);
              });
          }).then(function(data){
            console.log(data);
            return data;
          });

如何加载与链接数组相关联的页面?loader是一种获取html的promise

最常见的串行运行promise数组的方法是使用
数组

var pages = linksArray.then(function (arr) {
    var pArray = [];
    return arr.reduce(function (promise, link) {
        var ret = promise.then(function() {
            return loader(link)
             // the next 3 lines will ensure all links are processed - any failed links will resolve with a value == false
            .catch(function(err) {
                return false;
            });
        });
        pArray.push(ret);
        // next three lines log when each loader has finished
        ret.then(function() {
            console.log('finished', link);
        });
        return ret;
    }, Promise.resolve())
    .then(function() {
        return Promise.all(pArray);
    });
})
然后可以像这样访问结果

pages.then(function (data) {
    // data is an array of results of loader
    console.log(data);
}).catch(function(err) { // any errors should be logged here
    console.log(err);
});
工作原理:简单地说,对
loader
的每个调用在执行之前都会“等待”直到前一个调用被解析——每个加载程序的有效承诺都保存在一个数组中。最后一个加载程序解析后,
Promise.all
返回一个Promise,该Promise解析为对
loader

如果需要了解array.reduce的工作原理,请阅读


你期望(需要?
页面
会是什么?你期望(需要)在
块中作为
数据
是什么?然后
块?@JaromandaX我有一个链接数组,希望得到一个链接数组中的每个对应页面strings@JaromandaX朋友,5点后还没回来,怎么回事minutes@Jaromanda是的,朋友,请澄清一下works@Jaromanda所以,它不返回的原因是,一些页面加载失败?var ret=promise.then(函数(){return loader(link.replace(/^\s*.\s*$/g',);});推挤(后退);返回ret;},Promise.resolve())最后一部分“Promise.resolve()”,怎么会有逗号?我的下载速度是0.5Mbps,上传速度是6Mbps,链接数是750,20分钟后仍然没有返回。有什么想法吗?那么,用最新编辑的代码,你什么也得不到?查看开发者工具控制台。。。有错误吗?查看开发人员工具网络选项卡。。。是否有迹象表明请求正在发送?成功?失败?750个链接!-也许您不必一次只限制一个,而是可以使用-这允许每秒有一定数量的请求,只要使用新代码重新启动它。我正在从git bash控制台运行node。我不知道如何监控是否有任何内容发送哦,这是节点-当然您可以在代码的适当部分添加
console.log
s来查看它在做什么