试图合并异步方案

时间:2011-12-06 14:22:21

标签: javascript asynchronous

我有一个使用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吗?

1 个答案:

答案 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调用并构造代码以便与它们正常工作会更好。