私は、非同期関数(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
に置き換えられます。
は、ループの通常を使用してみてください: //このループは、自然の中での同期であります for(var i = 0、len = words.length; i