2

在使用 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,然后使用调用“getRate”函数,该函数使用 UPS 或 USPS api 向服务器发送 ajax 调用,以获取给定货件的费率。

这适用于 UPS,所有行立即开始加载并独立返回其费率。现在问题出在 Stamps.com,他们使用经过身份验证的肥皂对话,因此需要从第一次通话中接收验证字符串并在下一次通话中使用,依此类推。

所以基本上我需要修改上面的函数来执行“getRate()”函数并等待它完成,然后再执行下一次迭代。

有谁知道我怎么能不费吹灰之力地做到这一点?

编辑 - 澄清所提出的问题:

我想采用以下功能:

获取率(船ID);

并像这样访问它:

getRate(shipid, function(shipList) { _Function_data_here_ });

当我定义 getRate 函数时,如何定义它以使其具有回调能力?这是如何运作的?

4

1 回答 1

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

于 2012-07-14T00:17:23.963 回答