Javascript 如何在不链接的情况下处理多个相关的异步AJAX调用;。完成();?
我试图构建可重用的JavaScript对象来执行一些任务:Javascript 如何在不链接的情况下处理多个相关的异步AJAX调用;。完成();?,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,我试图构建可重用的JavaScript对象来执行一些任务: Service = { getSomeID : function() { // Get the ID from AJAX call // or from cookie if AJAX fails // or from URL parameter if no cookie }, doSomeRequest : function(url) { var id = this.getSomeId();
Service = {
getSomeID : function() {
// Get the ID from AJAX call
// or from cookie if AJAX fails
// or from URL parameter if no cookie
},
doSomeRequest : function(url) {
var id = this.getSomeId();
jQuery.getJSON(url + id, function(data)) {
// Do some really important stuff.
});
},
doSomeWork : function() {
this.doSomeRequest(this.getUrl());
},
getUrl : function() {
return 'http://example.com/';
}
};
Service.doSomeWork();
正如您所看到的,doSomeRequest()
函数需要获取由getSomeId()
函数提供的ID。这个函数的问题是,调用方应该只接收ID,而不是承诺,因为ID可以是来自不同位置的红色。所以从技术上讲,getSomeID()
是同步调用的完美候选。太糟糕了,因为:
从jQuery1.8开始,不推荐在jqXHR($.Deferred)中使用async:false;您必须使用success/error/complete回调选项,而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success()
因此,我们的目标是让函数只提供真实的信息,而不是延迟的承诺,这样这些返回值就可以安全地用于其他函数调用
我想避免几件事:
jQuery.getJSON()
,因为它将
这意味着我还必须传递url。这就变得简单了
getSomeId()
函数
getSomeId theinvokeCallbackWithParameter(callback,parameter)
函数,我不想要它,因为getSomeId()
可以在不同的上下文中使用,并且不是所有的上下文都涉及到AJAX调用.done().done().done()
这违背了为单独的用户提供单独功能的目的
一段逻辑,不允许我重用代码getSomeID()
可以返回一个延迟对象,您可以按照自己的意愿解析该对象,然后使用this.getSomeID().done(函数(id){jQuery.getJSON(url+id,函数(data)){//做一些非常重要的事情。});})代码>我的意思是:@A.Wolff我不会说我喜欢这个,但如果你把你的JS小提琴变成一个答案,我想我会接受的。虽然不推荐使用同步调用确实令人恼火。必须管理长链的.done().done().done()
真的很烦人,我看不出嵌套AJAX调用不能同步的原因。谢谢大家,这将使我以更好的方式编写下一个项目。getSomeID()
可以返回一个延迟对象,您可以根据需要解析该对象,然后使用this.getSomeId().done(函数(id){jQuery.getJSON(url+id,函数(数据)){//Do一些非常重要的东西。});})代码>我的意思是:@A.Wolff我不会说我喜欢这个,但如果你把你的JS小提琴变成一个答案,我想我会接受的。虽然不推荐使用同步调用确实令人恼火。必须管理长链的.done().done().done()
真的很烦人,我不明白嵌套AJAX调用不能同步的原因。谢谢大家,这将使我以更好的方式编写下一个项目。