我必須根據給定的配置文件在循環中創建承諾,並在全部解決時返回響應。代碼如下:在循環中創建承諾
{for(let type in spotlight){
switch (type){
case "outliers":{
let ops= spotlight[type];
for(let i=0;i<ops.length;i++){
(function(op){
let p= new Promise(function(resolve,reject){
let reqUrl= urlCreator(op.uri,op.query);
//console.log("--------------------"+reqUrl);
apiService.get(reqUrl,function(isSuccess,data){
if(!isSuccess){
return reject(data);
}
// console.log(isSuccess);
// console.log(data);
// console.log("trend is ------"+JSON.stringify(op));
// create objects array
// let temp= [];
// let overallScore= data.overall.score;
// for(let day in overallScore){
// temp.push({"key": day,"value": parseFloat(overallScore[day])});
// }
//let outliers= stats.outliers(temp,"key","value");
resolve({"type":type,"name": op.name,"data": outliers});
})
});
promiseArray.push(p);
}(ops[i]))
}
break;
}
case "filters":{
let ops= spotlight[type];
for(let i=0;i<ops.length;i++){
(function(op){
let p= new Promise(function(resolve,reject){
let reqUrl= urlCreator(op.uri,op.query);
apiService.get(reqUrl,function(isSuccess,data){
if(!isSuccess){
return reject(data);
}
// console.log(isSuccess);
// console.log(data);
// console.log("coc is ------"+JSON.stringify(op));
resolve({"type": type,"name": op.name,"data": data});
})
})
promiseArray.push(p);
}(ops[i]))
}
break;
}
}
}
Promise.all(promiseArray).then(values=>{
return res.json(values);
},
reason=>{
return res.json(reason);
}).catch(reason=>{
return res.json(reason);
})}
問題是承諾永遠不會返回,既不解決也不會被拒絕。
根據配置文件,它必須命中兩個網址,說u1和u2。我試圖記錄輸出以查看哪些請求正在返回。當服務器啓動並且第一次請求時,U1返回並且請求掛起。在刷新時,我從U2,U2和請求掛起得到響應,然後再次刷新U1,U1,並繼續。在我看來,出於某種原因,只有一個請求被返回,而其他的請求被放入緩衝區或其他地方,並在下一個請求發生時進入。這兩個請求都只對本地服務器進行,我只是爲了利用緩存而將其路由到外部,因爲url正被用作緩存的關鍵字。
我試着使用像facebook.com和google.com這樣的虛擬網址,它的工作原理非常好。使用一個本地URL和另一個像facebook.com也可以,但是當這兩個網址都是本地服務器時,它會卡住。
它是否與節點的單線程性質有關,或者是因爲使用相同的套接字來發出這兩個請求。
PS-我正在使用npm-request進行URL調用。