2013-03-27 38 views
0

我一直在尋找通過使用when Jquery的承諾,我想知道它是否能夠滿足我的方案或是否需要重新考慮我如何做事情。瞭解JQuery的承諾

所以我有一對夫婦聽衆的Backbone.js的模型,如:

this.on('supplier:change', function(){ 
    $.get('/supplier_details', function(data){ 
     // fill in some fields here 
     anotherAjaxCallInAnotherFunction(); 
    }); 
}); 

anotherAjaxCallInAnotherFunction: function(){ 
    // Another Ajax call 
} 

如果我使用when像這樣model.set({supplier: 'ss'}).done();將承諾能夠等到所有的Ajax調用結束?

如果我在我的骨幹模型中設置了需要多個Ajax調用的多個屬性,該怎麼辦?這個承諾是否會封裝模型的整個設置?

+0

不能確定的承諾,但異步=假在你的Ajax調用會做的伎倆,不是嗎? – Vassilis 2013-03-27 09:41:00

+0

但是,我建議你閱讀關於如何承諾工作https://raw.github.com/kriskowal/q/master/design/README.js如果你還沒有這樣做 – 2013-03-27 09:42:52

+1

@ant_Ti你確定嗎?最後一次,我的主幹與promise完全集成,比如'this.model.save()。done()' – Sammaye 2013-03-27 09:43:11

回答

1

有一件事我沒有意識到,直到我真的嘗試過這個,你可以用這種方式鏈接Ajaz調用,你只需要在編碼方面有點創意。

到鏈中的最簡單的方法,這些類型的呼叫是像這樣:

this.on('supplier:change', function(){ 
    return $.get('/supplier_details').then(function(data){ 
     return anotherAjaxCallInAnotherFunction(); 
    }); 
} 

function anotherAjaxCallInAnotherFunction(){ 
    return $.ajax(); 
} 

而只是鏈接這樣的遞延對象將允許您不僅使呼叫異步也做不鎖定瀏覽器線。

你可以在這裏找到更多的信息:http://api.jquery.com/jQuery.Deferred/

0

你可以嘗試:

$.when(firstAjaxCall, secondAjaxCall) 
    .done( 
     function(firstResp) { console.log(firstResp); }, 
     function(secondResp) { console.log(secondResp); } 
); 

,或者你可以listenTo一個sync事件,當firstAjaxCall成功返回,你可以調用secondAjaxCallBackbone Events

「同步」(型號,RESP,選項) - 模型(或集合)與服務器成功同步時。

+0

主要問題是,我不能直接調用時,如果你看我的例子我鏈接兩個Ajax調用,我想知道如果承諾可以覆蓋父函數調用,再加上我在這裏沒有同步 – Sammaye 2013-03-27 10:09:03

+0

你可以在'done()'中嵌入任意數量的調用,那麼爲什麼不嘗試呢? – Joe 2013-03-27 12:57:39

+0

等待等待,所以以我的例子而不是Jquery文檔中的一個爲例,通過在'done()'中嵌套調用,你的意思是什麼?如果我在'Done()'中嵌套未來的Ajax調用,我是不是忽略了promise的無回調狀態? – Sammaye 2013-03-27 13:00:43