代码之家  ›  专栏  ›  技术社区  ›  Run

在链中进行回调?

  •  0
  • Run  · 技术社区  · 11 年前

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

    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 回复  |  直到 11 年前
        1
  •  2
  •   Simon Staton    11 年前

    您正在尝试的操作将有效,但您需要传递回调以进行更新

    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');
    });
    
        2
  •  1
  •   Giuseppe Crinò    11 年前

    我真的很喜欢 回调地狱 编码风格,但有时会很痛苦。正如其他用户所建议的,您是否已经听说过 promises ?

    promise背后的核心思想是promise表示异步操作的结果。

    正如上面的链接中所建议的那样,一旦polyfill使用

    <script src="https://www.promisejs.org/polyfills/promise-done-6.1.0.min.js"></script>
    

    您将能够创建 new Promise 因此,使用他们的 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');
    });
    

    我没有测试代码,但 精神 是。:)

    编辑 :使用承诺是很棒的。我只是不喜欢人们发现它们,在代码库的较新部分使用它们,但最终不重构其余部分。