と再帰関数Iは、再帰関数を使用して1つのlodash機能(_.union)に2コールバックから2件の結果を転送しようとしています。 私は何が間違っているのか分かりません!私は "未定義"を得続けます。 EDITEDNodeJS:非同期要求
- : "約束" 技術
リモートDBで物事を確認する最初の関数と
私の新しいコード は、ここに私のコードです -
function findFiles(kw, callback){
if (_.isArray(kw)) {return callback(kw)};
return new Promise((resolve, reject) => {
console.log(kw);
word.aggregate([
{ $match: { keyWord: kw } },
{ $project: { filesFound: '$filesFound.fileName' , '_id':0} },
{ $sort: { fileName: 1 } }
],function(err, obj){
console.log('checked' + kw);
console.log(obj);
if (err) return reject(err);
else
return resolve(obj[0].filesFound);//obj[0].filesFound
})
})
}
主な機能:
function searchOperation(query, callback){
var stack=[];
if (!(_.includes(query, 'OR')) && !(_.includes(query, 'AND')) && !(_.includes(query, 'NOT'))){
findFiles(query)
.then((item) => {
console.log(item+'********');
callback(item)
})
.catch((err) => {
console.log(err)
})
}
else{
wordsArr = _.split(query, " ");
console.log("+++++:" + wordsArr);
wordsArr.forEach(function(w){
console.log('first check:'+w);
if(_.isEmpty(stack)){
if(_.includes(w, 'OR')){
console.log('found OR');
var statement = [];
console.log('query is:'+query);
statement = _.split(query, w, 2);
console.log(statement[0]+' , '+statement[1]);
return new Promise((resolve, reject)=>{
resolve(_.union(searchOperation(statement[0]),searchOperation(statement[1])))
})
//ANOTHER OPTION:
// searchOperation(statement[0],function(arr1){
// console.log('arr1');
// console.log('done part 1!');
// searchOperation(statement[1],function(arr2){
// console.log('who called arr2?');
// return(_.union(arr1,arr2));
// })
// });
}
}
})
}
}
今、関数の内部findFile()
console.log
は私が必要なものを返します。しかし、私は別の関数(共用体)で両方の戻り値を使用する必要があり、それは未定義を返します。
searchOperation('Expression1 OR Expression2', function(result){
res.json(result);
})
は今、私は確信している:メインスレッドで
何かが再帰関数とノードの非同期でうまくいかない...私は再帰的に動作するようにそれを必要と可能性
'((A NOT B) AND (C OR D))'
いくつかはそれのいずれかのwiを書き込むための正しい方法は何か知っている:のような表現は複雑ますth Promise
またはasync.waterfall
?? 事前に感謝!
[非同期呼び出しからの応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-コール) – gyre