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」を持つすべてのテーブル行を反復処理し、各メイン行には「shipment_#####」の ID があるため、各行を _ で分割して実際の出荷 ID を取得し、それを使用します。 UPS または USPS API を使用して ajax 呼び出しをサーバーに送信し、特定の貨物の料金を取得する「getRate」関数を呼び出します。

これは、UPS のすべての行が一度に読み込みを開始し、それぞれの料金を個別に返す場合に問題なく機能します。問題は現在 Stamps.com にあります。彼らは認証された SOAP 会話を使用しているため、認証文字列を最初の呼び出しから受信し、次の呼び出しで使用する必要があります。

したがって、基本的には、上記の関数を変更して「getRate()」関数を実行し、それが完了するのを待ってから次の反復を実行する必要があります。

大騒ぎせずにこれを行う方法を知っている人はいますか?

編集 - 尋ねられている質問の明確化:

私は次の機能を取りたい:

getRate(shipid);

次のようにアクセスします。

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 に答える