我有一个过时的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.
请建议。
由于
答案 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
});