syn*_*omy 7 javascript ajax jquery deferred
我正在寻找的最简单的例子是:
var messageLoader = $.post("api/user/messages", {api:data})
messageLoader.done(function(data){
//do something
});
Run Code Online (Sandbox Code Playgroud)
这种方法非常出色,但只有一次.如果我想更新数据,我必须重新定义所有内容.
我似乎无法找到任何延迟对象的调用,让我重新启动它.即messageLoader.redo()理想情况下,它会重新执行POST请求,然后调用相同的"完成"处理程序,而不必重新定义它.
我可以将它全部放在一个函数中,然后再简单地调用该函数,但这不是我正在寻找的,因为我还想要这样做:
var messageLoader = $.post("api/user/messages", {api:data})
var friendRequestLoader = $.post("api/user/friendrequests", {api:data})
$.when(messagesLoader, friendRequestLoader)
.done(function (messages, friendRequests) {
// update display of messages and friend requests
// attach Handlers
});
$("#updateMessages").click(function(){
messageLoader.redo() // This doesn't exist
})
Run Code Online (Sandbox Code Playgroud)
我们的想法是点击$("#updateMessages")会重新执行该请求,然后$.when()处理程序将使用新messageLoader数据和原始friendRequestLoader数据.
我已经查看了类似这样的文档,但没有找到任何东西.也许这里有人知道它是否存在,或者是一种完成同样事情的方法.
我很确定 Deferred 类并不是按照您想要的方式设计的,因为它们旨在成为一次性使用对象。我什至参加了 jQueryConf 上关于 Deferreds 的整个会议,甚至没有提到重用它们。
此外,从 Deferred API 页面可以看到:
http://api.jquery.com/category/deferred-object/
Run Code Online (Sandbox Code Playgroud)
没有重启方法。您也许可以手动更改 Deferred 的属性来模拟“重新启动”它,但实际上我认为此时您应该创建自己的类,因为您实际上正在寻找 Deferred 不提供的东西。
您必须记住,Deferred 的设计是为了让您可以说“嘿 Deferred,去做某事”( new Deferred().when(something)),然后您可以说“嘿 Deferred,完成后做 X”( deferred.then(x))。现在,当你说“当那件事完成时”,即。当您进行.then呼叫时,延迟可以处于两种状态:完成或未完成,但呼叫在任何一种情况下都有效(如果完成,则立即解析,否则等待触发)。
现在,如果 Deferred 可以有第三种状态(“完成但重新启动”),则.then调用将不知道要做什么:“完成但重新启动”是否意味着它应该触发它,或者不?答案取决于您是.then在重新启动调用之前还是之后进行调用,并且您希望看到所有情况都有可能变得相当复杂(特别是如果您允许多次重新启动)。
jQuery 人员没有处理所有这些(这些都不需要$.ajax),而是使用(相对简单的)当前的 Deferred 实现,我认为这对他们来说是正确的选择。
| 归档时间: |
|
| 查看次数: |
1545 次 |
| 最近记录: |