如何在javascript中对用户函数进行自定义回调

时间:2012-07-14 00:05:19

标签: javascript jquery callback

我在使用第三方库(如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函数时,如何定义它以使其具有该回调功能?这是怎么回事?

1 个答案:

答案 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调用的响应。