【发布时间】:2017-03-25 13:01:21
【问题描述】:
我有一个主视图,其中有一个框,其中包含您可以在它们之间切换的子视图
fetch ajax 调用成功后,主视图上会显示一个“成功”的 div。
我面临的问题是,当我在子视图之间切换时,前一个视图提取的延迟承诺仍然会被执行并显示“成功”div。
这是我的代码:
this.model.fetch().done(function() {
$('#success').show();
});
onChangeSubview: function() {
this.subview.unbind();
this.subview.remove();
}
这个 SO question abort-ajax-requests-using-jquery 说您可以将指针存储到 deferred 并通过调用 abort() 来停止它,如下所示:
var fetchXhr = this.model.fetch().done(function() {
$('#success').show();
});
onChangeSubview: function() {
fetchXhr.abort();
}
我对每个子视图有几个提取,并且一些在一个间隔内重复,这意味着我必须存储每个提取请求并循环遍历它们,在每个子视图上调用 abort。
有没有更好的方法来阻止延迟函数的执行? 例如:某种检查以查看子视图是否已被删除,或者取消绑定所有延迟承诺的功能?
【问题讨论】:
-
只是大声思考,您能否将子视图的所有提取添加到列表中,然后 onChangeSubview 您可以遍历它们并执行中止,例如
this.fetches.forEach(function(fetchXhr) { fetchXhr.abort(); });(或者_.invoke(this.fetches, 'abort');,如果你想用下划线的方式)。您甚至可以将此功能放在您扩展的基本视图中,以便将其中的一些抽象出来。 -
@Dymos +1。您太谦虚了,这不是评论,而是实际答案;)
-
哈哈谢谢 :-) 我会把它添加为后代的答案。
标签: javascript jquery backbone.js promise deferred