gpt4 book ai didi

javascript - Nodeschool 练习用 Promise 解决问题

转载 作者:太空宇宙 更新时间:2023-11-04 02:23:58 28 4
gpt4 key购买 nike

我正在解决nodeschool练习“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)})

});

});})

(它有效)但我在想如果我使用 promise ,这个练习会是什么样子?我尝试这样做

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

但是这段代码没有达到预期,只是说我失败了。在这种情况下,我假设这段代码不起作用,或者其中有一些我看不到的错误。那么 Promise 的解决方案是什么?

最佳答案

Erazihel 是对的,您缺少拒绝。至于如何用 Promise 包装它,我会在 Promise 构造函数执行器函数中放置尽可能少的代码,例如做最小的插入来填补支持 Promise 的函数的缺失。

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

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>

关于javascript - Nodeschool 练习用 Promise 解决问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31568485/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com