私は、指定された設定ファイルに従って約束をループで作成し、すべてが解決されたら応答を返す必要があります。ここにコードがあります。ループ内で約束を作成
{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の2つのURLにヒットする必要があります。私は出力をログに記録して、どのリクエストが返ってきたのかを確認しようとしましたサーバーが開始され、非常に最初のreqが行われると、U1が戻り、reqがハングします。リフレッシュすると、私はU2、U2からの応答を得て、リクエストがハングした後、再びリフレッシュしてU1、U1をリフレッシュし、これが続きます。何らかの理由で1つのリクエストだけが返され、他のリクエストはバッファや何かに座って次のリクエストが行われたときに来るようです。どちらのリクエストもローカルサーバーに対してのみ行われています。私は、URLがキャッシュのキーとして使用されているので、キャッシュを使用するために外部にルーティングしています。
facebook.comやgoogle.comのようなダミーのURLを使ってみましたが、それは完全にうまく動作します。ローカルURLを1つ使用し、facebook.comも同様に動作しますが、両方のURLがローカルサーバーの場合はスタックされます。
ノードのシングルスレッドの性質や、両方の要求を行うために同じソケットを使用することが関係していますか。
PS-私はURL呼び出しを行うためにnpm-requestを使用しています。