2016-10-20 14 views
0

私は、非同期関数(connection.query)を呼び出す関数を持っています。パラメータcommentを修正し、変更された値を変数resに保存して返します。しかし、問題は、returnステートメントがforEachの仕上げの前に実行されていることです。その内部には非同期関数があります。 2つのステートメントconsole.log("outside:" + res);return res;は、それより上のすべてが実行された後にのみ起こるようにするにはどうすればよいですか。JavaScript:非同期関数の混乱

var res = ""; 


function testComment(comment) { 
    var words = comment.split(" "); 
    words.forEach(function(word, i){ 
     (function(index){ 
      connection.query('select good_words from words where bad_words = ' + connection.escape(word), function(err, result){ 
       if(err){ 
        console.log(err); 
        return; 
       } 
       if(result.length != 0){ 
        this.res = comment.replace(word, result[0].good_words); 
        console.log("inside:" + this.res); 
       } 
      }); 
     })(i); 
    }); 
    console.log("outside:" + this.res); 
    return this.res; 
} 

私はこれを実行しようとした、私は、そうような値resを返す第2の機能を作成

function callback(){ 
    return res; 
} 

及びIは

、コールバックを受け入れて、このようにそれを返すように testComment修飾
function testComment(comment, callback){ 
    ..all the working..(forEach loop which has a asyn function in it) 
    return callback(); 
} 

しかし、ここでは、testCommentはを返します。これはforEachが完了する前です。本当に私を混乱させています。これを修正する方法はありますか?

EDIT:より多くのコンテキストの場合、この関数が何をするかで、 は私がbad_wordsのリストと(この場合はcomments)入力文字列でこれらのbad_wordsを交換good_wordsのリストを持っているデータベース内のテーブルを持っています。パラメータcommentは、bad_wordsについてテストされ、対応するgood_wordsに置き換えられます。

+0

は、ループの通常を使用してみてください: //このループは、自然の中での同期であります for(var i = 0、len = words.length; i

答えて

2

次のようなものを使用する必要がありますより便利

var wordsProcessed = 0; 
(function(index){ 
    connection.query('select good_words from words where bad_words = ' + connection.escape(word), function(err, result){ 
     wordsProcessed++; 
     if(err){     
      console.log(err); 
      return; 
     } 
     if(result.length != 0){ 
      this.res = comment.replace(word, result[0].good_words); 
      console.log("inside:" + this.res); 
     } 
     if(wordsProcessed >= words.length){ 
      //THIS IS WHERE YOU RETURN YOUR RES 
     } 
    }); 
})(i); 

かを、あなたは青い鳥使用する必要があります:)

var Promise = require('bluebird'); 
var promiseArray = words.map(function(word){ 
    return new Promise(function(resolve, reject){ 
     connection.query('select good_words from words where bad_words = ' + connection.escape(word), function(err, result){ 
      if(err) reject(err); 
      else resolve(result); 
     }); 
    }); 
}); 

Promise.all(promiseArray).then(function(result){ 
    return this.res; 
}); 
+0

ありがとう、私の人生を救った! – Scrotch