を持ってforループを私は一度呼び出さなっているこの機能を持っています。一致があれば、私はfalseとreturnでコールバックしたい。一致するものがなければ、私は真実に戻したい。からの復帰非同期呼び出し
hgetallが非同期であるため、両方の戻り値が呼び出されるので、私のロジックが間違っているのがわかります。どうすれば実行を停止し、一致するとすぐに戻りますか?お近くのlet-割り当てられた機能を呼び出す配列関数を、それに渡す - あなたが最も簡単な簡単な解決策を使用できるように
おかげ
を持ってforループを私は一度呼び出さなっているこの機能を持っています。一致があれば、私はfalseとreturnでコールバックしたい。一致するものがなければ、私は真実に戻したい。からの復帰非同期呼び出し
hgetallが非同期であるため、両方の戻り値が呼び出されるので、私のロジックが間違っているのがわかります。どうすれば実行を停止し、一致するとすぐに戻りますか?お近くのlet-割り当てられた機能を呼び出す配列関数を、それに渡す - あなたが最も簡単な簡単な解決策を使用できるように
おかげ
停止実行は、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));
何かが私の頭脳の中でベルリングを作ります。何も見つからずにエラーが発生しなかった場合のコールバックはどうですか?そしておそらく私は間違っていますが、このコードは同期的な実行に頼っていませんか?最初のインスタンスが2番目のインスタンスよりも応答に時間がかかる場合(そしてエラーをスローする)、2番目のインスタンスの 'cbc'関数はまだ存在しませんか? – Kaddath
@Kaddathあなたは正しいです、それは推奨されるユースケースのコードコンセプトです。もちろん、オリジナルの 'cbc'関数はn番目の呼び出し回数を監視し、最後の反復でfalse-branchコールバックを実行する必要があります。非同期の実行については、ほとんどの場合、問題はありません。なぜなら、すべてのクロージャには独自のインスタンスがあるからです。そしてもう一度 - それは主に、 '非同期コールバックからの復帰方法'の質問に答えるので、制御できない関数のコールバック呼び出しを止めることになります。 –
あなたのロジックを使用して、パラメータとしてコールバックを持って、完全に間違っていないので、結果がある場合には、コードが正しく上に行くだろう。しかし、何も返す必要はありません。これは、後でやらなければならないコードの実行を引き起こすものではありません。後に実行されるのは、 'validate'呼び出しの後に順番に置かれるのではなく、コールバック内になければなりません。簡単な解決策は、 'redis.hgetall'呼び出しを、varとして保存するための追加の引数' i'と 'callback'をとる関数にラップすることです。このように、 'i'の値は正しくなります – Kaddath