Javascript 诺德学校承诺解决问题的练习

Javascript 诺德学校承诺解决问题的练习,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我在解决学校的“变戏法异步”练习,我是这样解决的 var http=require("http"); var urls=process.argv.slice(2,process.argv.length); var count=0; var junge=[]; urls.map(function(url,index){ http.get(url,function(response){ var str=""; response.setEncoding("utf-8"); r

我在解决学校的“变戏法异步”练习,我是这样解决的

var http=require("http");
var urls=process.argv.slice(2,process.argv.length);
var count=0;
var junge=[];
urls.map(function(url,index){
http.get(url,function(response){
    var str="";
    response.setEncoding("utf-8");

    response.on("data",function(data){str=str+data})
    response.on("end",function(){
        junge.push(str);
        count++;
        if(index==urls.length-1) junge.map(function(v){console.log(v)})

    });

});})
var http=require("http");
var urls=process.argv.slice(2,process.argv.length);
var count=0;
var fin=[];
var promise=function(x){
    return new Promise(function(resolve,reject){
        http.get(x,function(response){
            response.setEncoding("utf-8");
            var junge=[];
            response.on("data",function(data){
                junge.push(data);
            });
            response.on("end",function(){
                resolve(junge)
            })
        })

    }
        )
    }
    function printitfgt(x){
        var m=promise(x);
        return m.then(function(response){
            fin.pus(response)
                    })
    }
urls.forEach(function(x,index){
    printitfgt(x);
    if(index==urls.length-1) console.log(fin)
})
(它是有效的)但我在想,如果我使用承诺,这个练习会是什么样子? 我试着这样做

var http=require("http");
var urls=process.argv.slice(2,process.argv.length);
var count=0;
var junge=[];
urls.map(function(url,index){
http.get(url,function(response){
    var str="";
    response.setEncoding("utf-8");

    response.on("data",function(data){str=str+data})
    response.on("end",function(){
        junge.push(str);
        count++;
        if(index==urls.length-1) junge.map(function(v){console.log(v)})

    });

});})
var http=require("http");
var urls=process.argv.slice(2,process.argv.length);
var count=0;
var fin=[];
var promise=function(x){
    return new Promise(function(resolve,reject){
        http.get(x,function(response){
            response.setEncoding("utf-8");
            var junge=[];
            response.on("data",function(data){
                junge.push(data);
            });
            response.on("end",function(){
                resolve(junge)
            })
        })

    }
        )
    }
    function printitfgt(x){
        var m=promise(x);
        return m.then(function(response){
            fin.pus(response)
                    })
    }
urls.forEach(function(x,index){
    printitfgt(x);
    if(index==urls.length-1) console.log(fin)
})

但这段代码没有达到预期,只是简单地说我失败了。在这种情况下,我假设这段代码不工作或者有一些我看不到的bug。那么承诺的解决方案是什么呢?

Erazihel是对的,你错过了
拒绝
。至于如何用承诺来包装它,我会在承诺构造函数executor函数中放入尽可能少的代码,例如,尽可能少地插入,以填补支持承诺的函数的空白

此外,我认为没有理由不使用
Promise.all
来并行处理URL(更快):

如果可以的话,我还会考虑使用

var控制台={log:function(msg){div.innerHTML+=msg+“
”;}; var http={get:function(u,f){ f({on:function(name,f){f(name==“data”&&u);}}); }}; 变量URL=[“结果1”,“结果2”]; Promise.all(url.map)(函数(url,索引){ 返回新承诺(功能(解决、拒绝){ var str=“”; get(url,函数(响应){ 关于(“数据”,函数(数据){str+=data;}); on(“end”,function(){resolve(str);}); 错误(“end”,function(){reject(str);}); }); }); })) .然后(功能(容格){ 控制台日志(junge); }) .catch(函数(e){console.log(e);})
Erazihel是对的,您缺少
拒绝
。至于如何用承诺来包装它,我会在承诺构造函数executor函数中放入尽可能少的代码,例如,尽可能少地插入,以填补支持承诺的函数的空白

此外,我认为没有理由不使用
Promise.all
来并行处理URL(更快):

如果可以的话,我还会考虑使用

var控制台={log:function(msg){div.innerHTML+=msg+“
”;}; var http={get:function(u,f){ f({on:function(name,f){f(name==“data”&&u);}}); }}; 变量URL=[“结果1”,“结果2”]; Promise.all(url.map)(函数(url,索引){ 返回新承诺(功能(解决、拒绝){ var str=“”; get(url,函数(响应){ 关于(“数据”,函数(数据){str+=data;}); on(“end”,function(){resolve(str);}); 错误(“end”,function(){reject(str);}); }); }); })) .然后(功能(容格){ 控制台日志(junge); }) .catch(函数(e){console.log(e);})