2

Backbone.js を使用して、通常は JSON 経由で Web サービスと通信するアプリケーションを構築しています。

1 つの Web サービスは、成功した場合は JSON を返し、エラーが発生した場合は XML を返します (賢いですね)。この XML 応答を解析してエラーを特定する必要がありますが、Backbone の JSON 中心の考え方が問題を引き起こしています。

解析関数を含むコレクションがあります。解析関数は、サービスが JSON を返すときに常に呼び出されます。この場合、単純に応答オブジェクトを返します。ただし、サービスが XML を返すと、フェッチ呼び出しのエラー コールバック関数が呼び出され、arguments[1]of でエラー オブジェクトが渡されますparseerror<さらに掘り下げると、予想外のキャラクターがあったことがわかります。

parseerror がスローされる前に、XML を解析するために解析関数が呼び出されないのはなぜですか? さらに、成功した JSON 呼び出しで JavaScript オブジェクトが渡されるのはなぜですか (JSON 文字列が既に解析されていることを示しています)。parse 関数は解析を行うはずではありませんか?

以下の関連コード、どんな提案も大歓迎です。

var myCollection = Backbone.Collection.extend({

initialize : function() {
    ...
},

fetch: function(options) {

    var options = {data: {...}, error: this.onFetchError};

    Backbone.Collection.prototype.fetch.call(this, options);
},

onFetchError: function(arg1, arg2, arg3) {

    debugger
},

parse: function(response) {

    debugger
    if(typeof response === 'object') {
        return response;
    }
}
});

return myCollection;
4

2 に答える 2

7

ドキュメントはこれについて曖昧です。 Model.fetch([options])を使用しBackbone.syncます。syncのドキュメントには、「他のすべての jQuery リクエスト オプション」を使用できると書かれています。これは、 jQuery.ajaxでサポートされているものを意味します。

したがって、応答を生のテキストとして取得するには、次のようにします。

this.fetch({ dataType: 'text' });

次に、parse関数で、必要に応じて応答を処理できます。

補足: XML をフェッチするモデルを取得しようとしたときにこれを理解し、その dataType でテストしました。

于 2012-11-10T16:12:39.357 に答える
3

デフォルトのフェッチを見ると:

fetch: function(options) {
  options = options ? _.clone(options) : {};
  var model = this;
  var success = options.success;
  options.success = function(resp, status, xhr) {

    //-->parse only invoked on success     
    if (!model.set(model.parse(resp, xhr), options)) return false;
    if (success) success(model, resp);
  };

  //-->parse not invoked on error
  options.error = Backbone.wrapError(options.error, model, options);
  return (this.sync || Backbone.sync).call(this, 'read', this, options);
}

parse がエラー状態で呼び出されることは決してないことがわかります。ただし、wrapError (以下を参照) は元の応答を返します。

Backbone.wrapError = function(onError, originalModel, options) {
  return function(model, resp) {
    resp = model === originalModel ? resp : model;
    if (onError) {
      onError(originalModel, resp, options);
    } else {
      originalModel.trigger('error', originalModel, resp, options);
    }
  };
}; 

したがって、arg2 には応答があり、おそらく、それを解析関数に渡すことができます。

于 2012-05-24T21:43:27.800 に答える