我正在解决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)
})
但是这段代码没有超出预期,只是说我失败了。在这种情况下,我假设这个代码不起作用或有一些我无法看到的错误。那么承诺会产生什么样的影响?
答案 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>