Мне трудно понять, как написать этот блок кода ...
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 есть много зависимостей от остального кода выше.
Так что я подумал об использовании отложенного / обещания, но как я могу выполнить код как обещание, если AJAX не всегда происходит?
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();
}
Тогда есть проблемы с областью видимости, замыканиями и прочим.Есть идеи?Мне просто нужно полностью реорганизовать, как я об этом?