用异步逻辑替换同步AJAX逻辑

时间:2015-01-27 14:58:33

标签: javascript jquery ajax

我有一个过时的JS库,它正在进行API调用同步,我决定编写JS函数,可以使用jQuery使它们成为异步。

在下面的代码中, getData 函数是一个泛型函数,它根据params传递API调用,然后从接收到的XML / JS中提取数据。

第二次调用( getAllData2 )需要 getData 结果集中的值,所以我需要一种回调类型的东西,在这种情况下可以在数据之后进行后续调用可在第一次通话时使用。 这可以在没有ajax成功回调的情况下实现,因为我希望getData函数保持通用。

我曾尝试过jQuery promises ,但是这给了我调用的原始数据,而不是我必须在每个完成回调中处理的已处理的数据。

getData(param1,param2..){
  var retData     = {};
    ......Param dependent code here..
    jQuery.ajax({
            url:....,
            .......
            success: function(resp){
                if(resp.length > 0){
                jQuery.each(resp,function(key,val){
                    var i = 0;
                    var retObj = {};
                    jQuery.each(val,function(k,v){
                        retObj[k] = v;
                        i++;
                    });
                    retData[key] = retObj;
                });             
            }
                ---Process recieved XML/JS and Insert values in retData here--
            }
    });
    return retData;
}

var getAllData  = getData(x,y);
var getAllData2 = getData(a,b); // this call needs param from getAllData.

请建议。

由于

1 个答案:

答案 0 :(得分:3)

承诺确实是你应该使用的。

这将允许您像这样构建逻辑:

function processResult(resp) {
    var retData = {};
    if(resp.length > 0){
        jQuery.each(resp,function(key,val){
            var retObj = {};
            jQuery.each(val,function(k,v){
                retObj[k] = v;
            });
            retData[key] = retObj;
        });  
    }
    return retData;
}

getData(x, y)
.then(function (result) {
    var processed = processResult(result);
    return getData(processed);
})
.then(function (result) { // result is the result of the second getData()
    // use result
});

如果您想在getData()函数中对结果进行预处理,请再次使用promises执行此操作:

function getData(param1,param2..) {
    ......Param dependent code here..
    return $.ajax({
        url:....,
        .......
    })
    .then(function (resp) {
        var retData = {};
        if(resp.length > 0){
            $.each(resp,function(key,val){
               var retObj = {};
               $.each(val,function(k,v){
                   retObj[k] = v;
               });
               retData[key] = retObj;
            });  
        }
        return retData;
   });
}

getData(x, y)
.then(function (processedResult) {
    return getData(processedResult, otherParameter);
})
.then(function (processedResult2) { 
    // use processedResult2
});