2017-07-21 14 views
0

を持ってforループを私は一度呼び出さなっているこの機能を持っています。一致があれば、私はfalseとreturnでコールバックしたい。一致するものがなければ、私は真実に戻したい。からの復帰非同期呼び出し

hgetallが非同期であるため、両方の戻り値が呼び出されるので、私のロジックが間違っているのがわかります。どうすれば実行を停止し、一致するとすぐに戻りますか?お近くのlet-割り当てられた機能を呼び出す配列関数を、それに渡す - あなたが最も簡単な簡単な解決策を使用できるように

おかげ

+0

あなたのロジックを使用して、パラメータとしてコールバックを持って、完全に間違っていないので、結果がある場合には、コードが正しく上に行くだろう。しかし、何も返す必要はありません。これは、後でやらなければならないコードの実行を引き起こすものではありません。後に実行されるのは、 'validate'呼び出しの後に順番に置かれるのではなく、コールバック内になければなりません。簡単な解決策は、 'redis.hgetall'呼び出しを、varとして保存するための追加の引数' i'と 'callback'をとる関数にラップすることです。このように、 'i'の値は正しくなります – Kaddath

答えて

1

停止実行は、hgetall機能の責任です。一致が見つかった後(またはエラーが発生した)、ローカル関数を空に置き換えます。最新のESインタプリタオプティマイザはコードを十分に速く実行しますが、追加のコールバックは実行されません。次のような

何か:

let cbc = function() { 
    let newUrl = roomData.url.toLowerCase(); 
    let existingUrl = rooms[i].url.toLowerCase(); 
    let newRoomName = roomData.roomName.toLowerCase(); 
    let existingRoomName = rooms[i].roomName.toLowerCase(); 
    // ...... 
    if(found) { 
     cbc =() => {}; 
     callback(result); 
     return 
    } 
}  
// ...... 
redis.hgetall(key, (...args) => cbc(...args)); 
+0

何かが私の頭脳の中でベルリングを作ります。何も見つからずにエラーが発生しなかった場合のコールバックはどうですか?そしておそらく私は間違っていますが、このコードは同期的な実行に頼っていませんか?最初のインスタンスが2番目のインスタンスよりも応答に時間がかかる場合(そしてエラーをスローする)、2番目のインスタンスの 'cbc'関数はまだ存在しませんか? – Kaddath

+0

@Kaddathあなたは正しいです、それは推奨されるユースケースのコードコンセプトです。もちろん、オリジナルの 'cbc'関数はn番目の呼び出し回数を監視し、最後の反復でfalse-branchコールバックを実行する必要があります。非同期の実行については、ほとんどの場合、問題はありません。なぜなら、すべてのクロージャには独自のインスタンスがあるからです。そしてもう一度 - それは主に、 '非同期コールバックからの復帰方法'の質問に答えるので、制御できない関数のコールバック呼び出しを止めることになります。 –

関連する問題