2017-03-05 15 views
1

と再帰関数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 ?? 事前に感謝!

+2

[非同期呼び出しからの応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-コール) – gyre

答えて

1

非同期応答を同期方式で取得しようとしているため、コードが機能しません。

約束を見てください。

+0

あなたはasync.waterfallでそれを書く正しい方法は何ですか? – DavidA

+0

コールバックを渡すか、または 'query'関数で約束を使用し、ウォーターフォールコールバックの完了時にコールバックを呼び出すと、基本的にウォーターフォール呼び出しであなたの約束を解決します:https://www.npmjs.com/package/async-waterfall #tasks-as-array-of-functions – Nijikokun

+0

ありがとう、私はすでにそれを見ました。私のコードと組み合わせる方法はまだ分かりません。:( – DavidA

関連する問題