我很难弄清楚如何编写这段代码......
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();
}
然后是范围界定和关闭等问题。有任何想法吗?我是否只需要完全重新组织我将如何处理这件事?