在链中进行回调?

时间:2015-01-23 16:35:23

标签: javascript jquery ajax callback

我们可以在这样的链中进行回调吗?

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');
    });

修改

jsfiddle

2 个答案:

答案 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非常棒。我不喜欢当人们发现它们时,在代码库的新部分使用它们,但最终不会重构其余部分。