我正在尝试构建可重用的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();
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()
是同步呼叫的完美候选者。太糟糕了,因为:
从jQuery 1.8开始,不推荐使用async:false和jqXHR($ .Deferred);您必须使用success / error / complete回调选项而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success()。
所以我们的目标是让函数只提供真实的信息,而不是延期的promises,这样这些返回值就可以安全地用在其他函数调用中。
我想避免一些事情:
避免将回调传递给getSomeId()
函数
将用于调用另一个jQuery.getJSON()
,因为它会
意味着我还必须通过网址。这变得简单
getSomeId()
函数进入
我不想要getSomeIdThenInvokeCallbackWithParameter(callback, parameter)
函数,因为getSomeId()
在不同的上下文中可用,而不是所有函数都涉及进行AJAX调用。
避免多次链接.done().done().done()
这就破坏了单独使用单独功能的目的
逻辑片段,不允许我重复使用代码。