非同期検索コールを実行します。検索結果は一度に返されません。私はすぐに最高200の結果を得る。次の結果セットでは、最初の結果セットからブックマークを抽出する必要があります。したがって、クエリは順次発生する必要があります。私は以下のコードを書いていますが、動作しません。次のループ(forループ)は、最初のクエリを終了することなく実行されます。私はこれを解決する方法を知らない。nodejsの非同期関数への再帰呼び出し
var getQueryResult = function(resourcetypeStr, startTime, endTime, bookmark){
var promise = new Promise(function(resolve, reject) {
var options = {
OPTIONS
};
search(DESIGN_DOC, INDEX, options) //Async function
.then(function (data) {
resolve(data);
})
.catch(function(error){
logger.error("Error querying database " + resourcetypeStr + ": " + error);
return reject(error);
});
});
return promise;
};
var getRemainingData = function(resourcetypeStr, startTime, endTime, bookmark, number){
var promise = new Promise(function(resolve, reject){
var result;
for(i = 0; i<number; i++){
var data = getQueryResult(resourcetypeStr, startTime, endTime, bookmark).then (function(data){
if(result){
result = result.concat(data);
}else{
result = data;
}
if(data.row.lenth ===0){
resolve(result);
}
bookmark = data.bookmark;
return data;
});
}
});
return promise;
};
var getResources = function (resourcetypeStr, list, startTime, endTime) {
var promise = new Promise(function(resolve, reject) {
var options = {
OPTIONS
};
return search(DESIGN_DOC, INDEX, options)//Async function
.then(function (data){
if(data.total_rows > 200){
debugger;
getRemainingData(resourcetypeStr, startTime, endTime, data.bookmark, function(result){
resolve(data.concat(result));
});
}else{
resolve(data);
}
})
.catch(function(error){
console.log("reject error :"+error);
return reject(error);
});
});
return promise;
};
私はまた、コールバックで
function getRemainingData(resourcetypeStr, uuidQueryString, startTime, endTime, bookmark, number, callback) {
var result; // clone collection
(function getOne(resourcetypeStr, uuidQueryString, startTime, endTime, bookmark) {
console.log("getOne is called");
getRemainingData(resourcetypeStr, uuidQueryString, startTime, endTime, bookmark).then(function(data){
if(result){
result = result.concat(dataToJson(data));
}else{
result = dataToJson(data);
}
if(data.row.lenth ===0){
callback(result);
}else{
setTimeout(getOne(resourcetypeStr, uuidQueryString, startTime, endTime, data.bookmark), 0);
}
});
})();
}
を試してみましたが、これはあふれスタックです。なぜ私のテストケースでは300の結果しかないので、ここで一度だけ実行するのが理想的であるかはわかりません。
'VARデータになることはありません場合はこれが唯一の無限行くことができますので、
は、は、data.row.lengthの値をチェックresourcetypeStr、startTime、endTime、bookmark).then() 'これは外部データ変数を毎回上書きしないのですか?私はあなたのプロミスが毎回ガベージコレクションをしていることに感謝しています。あなたが次のものでそれぞれの約束を上書きするからです。 'Promise.all()'でこれを実装してみて、頭痛の種にならないようにしてください。 :) – Shilly
問題は、検索データが返される前にforループが進行していることです。次のブックマークは、最初の検索のデータからのものでなければなりません。 – yogeshkakde