2

私は次のようにコードを書いています:

var MyLib = (function (window, $, undefined) {
    return {
        URI: 'http://testpage/API/',
        OnSuccess: function (data, status) { },
        OnError: function (request, status, error) { },
        MakeRequest: function (method, args) {
            $.ajax({
                type: 'POST',
                url: this.URI + '/' + method,
                contentType: 'application/json; charset=utf-8',
                data: args,
                dataType: 'json',
                success: this.OnSuccess,
                error: this.OnError
            });
        },
        GetSamples: function (data1, data2) {
            var args = {
                data1: data1,
                data2: data2
            };
            this.MakeRequest('GetTestData', JSON.stringify(args));
        }
   };
} (this, jQuery));

そのため、AJAX呼び出しを呼び出したい場合は、次のようにします。

function OnSuccess(data, status) {
   // ...
}

function OnError(request, status, error) {

}

MyLib.OnSuccess = OnSuccess;
MyLib.OnError = OnError;
MyLib.GetSamples("data1", "data2");

GetSamplesの署名を変更したくないので、上記のように実装することにしました。これが許容できるアプローチであるかどうか(またはこれを改善する方法)についての提案はありますか?

4

4 に答える 4

3

あまりjavascriptの慣用句ではありません。.NETコードのように見えます。javascriptでコールバックを提供する標準的な方法は、それらを引数として渡すことです。ただし、メソッドのシグネチャを変更できない場合は、GetSamplesこのアプローチも状況に応じて機能すると思います。すべてのAPIに一般化するわけではありません。この特定の状況での回避策としてのみ使用してください。

于 2012-07-10T06:53:37.447 に答える
1

興味深いトピック。多くのJavaScript開発者が次のようなことをしているのを目にします。

(function ($, window, document) {

  "use strict";

  var App = (function () {

    function App() {
      this.url = 'http://testpage/API';
      this.debug();
    }

    App.prototype = {

      url: 'http://testpage/API',

      success: function (data, status) {},

      error: function (req, status, err) {},

      request: function (command, options) {
        $.get({
          type: 'POST',
          url: this.url + '/' + command,
          contentType: 'application/json; charset=utf-8',
          data: options || {},
          success: this.success,
          error: this.error
        });
      },

      getSample: function (data1, data2) {
        this.request('getTestData', JSON.stringify({
          data1: data1, data2: data2
        }));
      }


    };

    return App;

  })();


})(jQuery, window, document);

アプリに複数のインスタンスをページに含める必要がある場合に、メソッドを再定義する必要がないように、プロトタイプのアプローチが使用されていると思います。

また、JavaScriptでは、主な命名規則はキャメルケースであることに注意してください。私の同僚は、JSデザインパターンにも適用されるパターンのリストをBackbone.jsに作成しました。http://ricostacruz.com/backbone-patterns/

于 2012-07-10T07:39:41.367 に答える
1

また、jQuery AJAXオブジェクトを返し、リクエストを使用する場所で.done()を呼び出すこともできます。

好き:

var MyLib = (function (window, $, undefined) {
    return {
        URI: 'http://testpage/API/',
        OnSuccess: function (data, status) { },
        OnError: function (request, status, error) { },
        MakeRequest: function (method, args) {
            return $.ajax({
                type: 'POST',
                url: this.URI + '/' + method,
                contentType: 'application/json; charset=utf-8',
                data: args,
                dataType: 'json'
            });
        },
        GetSamples: function (data1, data2) {
            var args = {
                data1: data1,
                data2: data2
            };
            return this.MakeRequest('GetTestData', JSON.stringify(args));
        }
   };
} (this, jQuery));

その後:

function OnSuccess(data, status) {
   // ...
}

function OnError(request, status, error) {

}

MyLib.GetSamples("data1", "data2").done(OnSuccess).fail(OnError);

これらはjQuerydeferredsと呼ばれます。APIを見てください。IMOは、非同期呼び出しを処理するための非常にクリーンな方法です。

于 2012-07-10T06:53:26.130 に答える
1

Darin Dimitrovに同意し、コールバックを1つだけ使用することを提案します。成功と失敗の2つではありません。例えば:

MyLib.GetSamples("data1", "data2", function(err, response) {

});

このアプローチを使用することで、コールバックを1つだけ処理し、クラスを使用する開発者がエラーのチェックを忘れないようにすることができます(これは、最初にerr属性を配置するというアイデアです)。

于 2012-07-10T07:13:46.040 に答える