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);})代码>