nodeschool运动用承诺解决

时间:2015-07-22 16:09:44

标签: javascript node.js es6-promise

我正在解决nodechool运动" Juggling Async"我解决了这个问题

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)
})

但是这段代码没有超出预期,只是说我失败了。在这种情况下,我假设这个代码不起作用或有一些我无法看到的错误。那么承诺会产生什么样的影响?

1 个答案:

答案 0 :(得分:0)

Erazihel 是对的,你错过了reject。至于我如何用promises包装它,我会尽可能少地将代码放在Promise构造函数执行器函数中,例如做最小的插件,填补缺少支持承诺的功能。

此外,我认为没有理由不使用Promise.all并行执行网址(更快):

Promise.all(urls.map(function(url) {
  return new Promise(function(resolve, reject) {
    var str = "";
    http.get(url, function(response) {
      response.on("data", function(data) { str+=data; });
      response.on("end", function() { resolve(str); });
      response.error("end", function() { reject(str); });
    });
  });
}))
.then(function(junge) {
  console.log(junge);
})
.catch(function(e) { console.log(e); });

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

var console = { log: function(msg) { div.innerHTML += msg + "<br>"; }};
var http = { get: function(u, f) {
  f({ on: function(name, f) { f(name == "data" && u); }});
}};
var urls=["result1", "result2"];

Promise.all(urls.map(function(url,index) {
  return new Promise(function(resolve, reject) {
    var str = "";
    http.get(url, function(response) {
      response.on("data", function(data) { str+=data; });
      response.on("end", function() { resolve(str); });
      response.error("end", function() { reject(str); });
    });
  });
}))
.then(function(junge) {
  console.log(junge);
})
.catch(function(e) { console.log(e); });
<div id="div"></div>