2013-03-27 70 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