我有一个使用getJSON的几个实例的应用程序,我遇到了很多麻烦。 Pointy曾建议重新编写主程序以包含异步处理,我同意(现在我理解了这一点)。
在尝试重做之前,它的结构如下:
Fill some arrays;
Call processArray to create a set of strings for each;
Stick the strings into the DIVs.
在processArray例程中,我调用$ .getJSON - 几次,你们大家都指出我遇到了我无法期待的值的麻烦。整个例程将一个数组处理成一个复杂的字符串,但某些数组必须先进行排序(非常规)。我原来的结构开始问:这是一个要排序的数组吗?如果是这样,我做了这样的,涉及getJSON,然后返回主程序。我对数组做了什么并没有超过主程序,主程序继续看到原始的数组内容。
所以,processArray的配置如下:
function processArray(arWorking, boolToSort...) {
if(boolToSort) {do special stuff}
//continue on with processing
return complexString;
}
我认为如果使用boolToSort = true 调用processArray,我会尝试通过将'arWorking'参数替换为执行排序的函数来保证将排序数组包含在主例程中。在我的想法中,主程序的其余部分将继续使用两种形式的数组之一:原始传递或排序数组。为此,我将排序例程作为一个单独的例程:SortArray(arrayToUse)。
我想出了这个:
function processArray( function(arWorking) {if(boolToSort) SortArray(arWorking); else return arWorking;}, boolToSort, ...) {
//main routine
return complexString;
}
FireFox和IE9对象。 FF打破了jQuery,而IE9想要在调用参数中使用标识符。 什么看起来是错的?我可以在“参数函数”中使用boolToSort吗?
答案 0 :(得分:0)
您理解这一点的第一部分是:
$.getJSON()
它是异步工作的。这意味着当你调用它时,它只是启动操作。 $.getJSON()
调用在后台运行时,该函数后面的代码将继续执行。一段时间后,JSON结果将可用,成功处理程序将被调用。
只有在成功处理程序中才能使用这些结果。
因此,您无法编写执行此操作的正常程序代码:
function processArray() {
$.getJSON(url, function(data) {
// only in here can you process the data returns from the getJSON call
})
// you cannot use the JSON data here as it is not yet available
// you cannot return any of the JSON data from the processArray function
}
相反,您必须编写使用成功处理程序的代码。这是一种方法:
function processArrays(urlToProcess1, urlToProcess2, callbackWhenDone) {
$.getJSON(urlToProcess1, function(data) {
// only in here can you process the data returns from the getJSON call
// do whatever you want to do with the JSON data here
// when you are done process it, you can then make your next getJSON call
$.getJSON(urlToProcess2, function(data) {
// do whatever you want to do with the JSON data here
// when done, you can then call your callback function to continue on with other work
callbackWhenDone();
});
});
}
你不能做的另一件事是:
function processArray() {
var result;
$.getJSON(url, function(data) {
// only in here can you process the data returns from the getJSON call
result = data;
})
return(result);
}
var data = processArray();
// code that uses data
您无法执行此操作,因为processArray()返回时结果数据不可用。这意味着你不仅可以在processArray中使用它(但在成功处理程序之外),但是你不能从processArray()返回它,并且你不能在processArray()之后编写的代码中使用它。您只能在成功处理程序或成功处理程序调用的代码中使用该数据。
如果您要处理一大堆URL并且在每个URL上使用相同的代码,则可以传递一个URL数组并循环遍历它们,只有在调用第一个成功处理程序时才启动下一个getJSON调用
如果您有一大堆URL,每个URL都有不同的代码,您可以传递一组URL和一组回调函数(每个URL一个)。
仅供参考,我认为传递boolToSort没有问题。对我来说,问题就在于如何处理异步ajax调用。
为了完整性,可以使用同步ajax调用,但不推荐这样做,因为它是一种糟糕的用户体验。它在网络操作期间锁定浏览器,这通常不是一件好事。使用正常的异步ajax调用并构造代码以便与它们正常工作会更好。