我试图找到一种取消BreezeJS查询的方法,以实现在按键上查询BreezeJS的实时搜索(请参阅我的other question)。
我知道在Angular中,可以通过将promise传递给$http
对象中的timeout
参数,然后在该promise上调用config
来取消resolve()
个请求
我也知道我可以让BreezeJS使用我的模块$http
以及:
var ajax = breeze.config.initializeAdapterInstance('ajax', 'angular');
ajax.setHttp($http);
所以我在考虑在request
上创建一个$http
拦截器,将config.timeout
设置为一个承诺。但是这仍然离我解决问题只有几步之遥,因为我会以某种方式需要能够从运行查询的代码中向我的拦截器提供承诺(以便查询代码可以resolve()
承诺如果需要的话。)
有更好的方法吗?它甚至可能吗?
答案 0 :(得分:2)
您可以使用AJ.1适配器的requestInterceptor
从v.1.4.12开始设置HTTP级别的超时和取消。请参阅文档"Controlling AJAX calls"。
EntityManager HTTP服务操作不提供取消或超时选项。也许有一天他们会。
v.1.4.11 Breeze AJAX适配器也不提供取消或超时选项。 但是他们将在v.1.4.12 中,您现在可以在github上看到预览。
github上的示例说明了使用新适配器的取消和超时。对于jQuery AJAX组件的用户,有DocCode:jQueryAjaxAdapterTests.js。对于Angular $http
的用户,有Zza-Node-Mongo:ajax-adapter.async.spec.js。
最好是你可以运行样本,但如果你不能(也许是因为你没有使用其中一种技术),测试文件(见上面的链接)很容易阅读,你应该收集这些想法这会有所帮助。至少我希望如此。
取消和超时是有用的功能。你的用例需要它们吗?也许。但是你想要第一步去除用户输入你的“实时搜索”的文本,这样你就不会发出100次毫无意义的查询。
your related StackOverflow question中讨论了这一观察结果。