私はこのコードのブロックを書く方法を理解するのが難しいです...
function myFunction(x,y,z) {
// do some stuff here (code block A)
// then some stuff here (code block B)
// but...
if (y == 73) { // y isn't always 73...
// I need more data from the server before I can complete this function
$.getJSON("data.php", {y: 73, z: z}, function(data) { ... });
}
// and finally some other code down here (code block C)
// And done!
$.post("data.php", {data: someVariable}, callbackFx);
}
したがって、私が抱えている概念上の問題は、指定された入力に対してサーバーからより多くのデータを取得する必要があることに気付いた後、実行したいコード(コードブロックC)があることです。それはいつも起こるわけではありませんが、私は本質的に実行を一時停止したいと思います。そして、私たちは皆、同期AJAXが犯罪であり、Javascriptの神々からむち打ちをすることで罰せられることを知っています。
最初は、コードブロックCはそれ自体の関数に入れるべきだと思いましたが、コードブロックCには上記の残りのコードに多くの依存関係があるため、面倒になります。
そこで、deferred / promiseを使用することを考えましたが、AJAXが常に発生するとは限らない場合、promiseとしてコードを実行するにはどうすればよいですか?
if (y == 73) {
var deferred = $.getJSON("data.php", {y: 73, z: z}, function(data) { ... });
deferred.always(function() { ... });
}
else {
// that function in the deferred never gets called
}
私が考えることができる「良い答え」に最も近いのは次のとおりでした(しかし、それが実際に「良い答え」であるかどうかはわかりません)...
var codeBlockC = function() { ... };
if (y == 73) {
var deferred = $.getJSON("data.php", {y: 73, z: z}, function(data) { ... });
deferred.always(codeBlockC);
}
else {
codeBlockC();
}
次に、スコープやクロージャなどに問題があります。何か案は?これについてどうやって行くのかを完全に再編成する必要がありますか?