我在使用第三方库(如jquery)时一直使用回调,但是我遇到了需要设置自己回调的问题。以我当前的代码为例:
// Get All Rates
function getAllRates() {
$('#shiplist tr.mainRow').each(function() {
var curid = $(this).attr("id");
var cursplit = curid.split("_");
var shipid = cursplit[1];
getRate(shipid);
});
}
这将遍历所有具有类“mainRow”的表行,并且每个主行的id都为“shipment _ #####”,因此对于每一行,它将_分割以获取实际的船舶ID,然后它使用calla“getRate”函数,该函数使用UPS或USPS api向服务器发送ajax调用以获取给定货件的费率。
这适用于UPS所有行立即开始加载并独立返回其费率。问题出现在Stamps.com上,他们使用经过身份验证的肥皂对话,因此需要从第一次呼叫接收验证字符串并在下次呼叫中使用,依此类推。
所以基本上我需要修改上面的函数来执行“getRate()”函数并在执行下一次迭代之前等待它完成。
任何人都知道如何通过大量的大惊小怪来做到这一点?
编辑 - 对所提问题的澄清:
我想采取以下功能:
的getRate(shipid);
并像这样访问它:
getRate(shipid,function(shipList){_ Function_data_here_});
当我定义getRate函数时,如何定义它以使其具有该回调功能?这是怎么回事?
答案 0 :(得分:2)
我建议您一次提取所有ID并将它们传递给您的函数。这样,您可以轻松地单独处理第一个,之后继续处理。使用延迟对象,这非常简单。
例如:
function extractAllIds(callback) {
var ids = $('#shiplist tr.mainRow').map(function() {
return this.id.split('_')[1];
}).get();
callback(ids);
}
function getRates(ids) {
var first = ids.shift();
$.ajax({data: first, ...}).done(function(response) {
// extract the authenticator string
for(var i = ids.length; i--; ) {
$.ajax({data: ids[i], ...});
}
});
}
extractAllIds(getRates);
无论如何,你不能让$.each
等待Ajax调用的响应。