我们可以在这样的链中进行回调吗?
Widget.update(...).onUpdate(function(data){
console.log('updated');
});
当前代码,
var Gateway = {};
Gateway.put = function(url, data, callback) {
$.ajax({
type: "POST",
dataType: "xml",
url: url,
data: data,
async: true,
success: function (returndata,textStatus, jqXHR) {
callback(returndata);
}
});
};
var Plugin = function() {};
Plugin.prototype = {
update : function(options, callback) {
/// other stuff
Gateway.put($url, $data, function(data){
callback(data);
}
return this;
}
}
用法,
var Widget = new Plugin();
Widget.put({
button: options.button
}, function(data){
console.log('updated');
});
但理想情况下,
Widget.update(...).onUpdate(function(data){
console.log('updated');
});
修改
答案 0 :(得分:2)
您尝试执行的操作无论您需要将回调传递给更新
Widget.update(yourOptions, function(data){
console.log('updated');
});
你也可以直接返回你的ajax请求并链接到它
var Gateway = {};
Gateway.put = function(url, data) {
return $.ajax({
type: "POST",
dataType: "xml",
url: url,
data: data,
async: true
});
};
var Plugin = function() {};
Plugin.prototype = {
update : function(options) {
/// other stuff
return Gateway.put($url, $data);
}
}
var Widget = new Plugin();
Widget.update(yourOptions).done(function() {
console.log('updated');
});
答案 1 :(得分:1)
我非常喜欢回调地狱编码风格,但有时它很痛。正如其他用户所建议的那样,您是否已经听说过promises?
承诺背后的核心思想是,promise表示异步操作的结果。
正如上面的链接所示 - 为他们提出了一个标准 - 一旦使用填充浏览器
<script src="https://www.promisejs.org/polyfills/promise-done-6.1.0.min.js"></script>
您将能够创建new Promise
&#39; s,因此可以使用其良好的done()
属性。
你最终会得到
Plugin.prototype.update = function (options) {
return new Promise(function (fullfill, reject) {
Gateway.put($url, $data, function (data) {
fullfill(data);
});
});
};
也就是说,Plugin.prototype.update
会返回一个承诺。
Widget.update(...).done(function(data){
console.log('updated');
});
我没有测试过代码,但精神就是这样。 :)
编辑:使用promises非常棒。我不喜欢当人们发现它们时,在代码库的新部分使用它们,但最终不会重构其余部分。