1

データベースへの 2 つの非同期呼び出しで顧客 (会社) とその連絡先を作成するページがあります。連絡先は、サーバーの応答に含まれる顧客 ID が必要なため、顧客の後に保存する必要があります。また、すべてが完了すると、適切な新しい顧客ページにリダイレクトされます。

そのままでは、連絡先が保存される前でもリダイレクトが発生します。jQuery の$.when()とを使用してみましたが、 と コールバック.done()の間に切断があるため、おそらく機能しません。.when()この状況でどのように機能させることができますか?

function saveAll() {
    createCustomer();
    createContacts();
    var url = "<newCustomerDetailPage>";    // redirect when all is done
    window.location = url;
}


function callback(result) {
    if (result) {
        // do something
    } else {
        // do something else
    }
}


function errorHandler(error) {
    // do something
}


function createCustomer() {       // Create 1 new customer
    // prep fields
    var client = new toolkit.Client();
    client.create(<fields>, callback, errorHandler);
}


function createContacts() {       // Create 1 or more new contacts
    $('.row').each(function() {
        // prep fields
        createContact(fields);
    }
}


function createContact(fields) {      // Create 1 new contact
    var client = new toolkit.Client();
    client.create(<fields>, callback, errorHandler);
}


function handleResult(result, callback, errorHandler) {
    if (blah...)
        callback(result)
    else
        errorHandler(error)
}

ツールキット.クライアント:

toolkit.Client = function(){}

toolkit.Client.prototype.create = function(fields, callback, errorHandler) {
    // async call to database 
    function(result){        // handle server response
        handleResult(result, callback, errorHandler);
    }
}

client.create一度に 1 つのレコードしか保存できないことに注意してください。

すでに試しました:

var actions = [];

function createContacts() {       // Create 1 or more new contacts
    $('.row').each(function() {
        // prep fields
        actions.push(function(){createContact(fields);});
    }
}

function saveAll() {
    createCustomer();
    createContacts();
    $.when.apply($,actions).done(function(){
        var url = "<newCustomerDetailPage>";    // redirect when all is done
        window.location = url;
    });
}
4

2 に答える 2

1

次を使用して、各ループの終わりを待つことができますpromise

var actions = [];

function createContacts(callback) {       // Create 1 or more new contacts
    $('.row').each(function() {
        // prep fields
        actions.push(function(){createContact(fields);});
    }.promise().done(callback);
}

function saveAll() {
    createCustomer();
    createContacts(function(){
        $.when.apply($,actions).done(function(){
            var url = "<newCustomerDetailPage>";    // redirect when all is done
            window.location = url;
        });
    });

}
于 2013-06-09T13:17:22.623 に答える
0

理想的client.createには、連絡先の作成を担当する唯一のメソッドであり、それを解決できる唯一のメソッドであるため、遅延オブジェクトを返す必要があります。

toolkit.Client.prototype.create = function(fields, callback, errorHandler) {
    var def = $.Deferred();
    // async call to database 

    //resolve def when the result is ready
    //def.resolve or def.refect();

    return def;
}

createContact結果も返す必要があります。

function createContact(fields) {      // Create 1 new contact
    var client = new toolkit.Client();
    return client.create(<fields>, callback, errorHandler);
}

その後、次のことができます。

function createContacts() {       // Create 1 or more new contacts
    var actions = [];
    $('.row').each(function() {
        // prep fields
        actions.push(createContact(fields));
    }

    return actions;
}

function saveAll() {
    createCustomer();
    $.when.apply($, createContacts()).done(function(){
        var url = "<newCustomerDetailPage>";    // redirect when all is done
        window.location = url;
    });
}
于 2013-06-09T13:32:56.023 に答える