gpt4 book ai didi

ajax - Backbone.js Backbone.wrapError 函数

转载 作者:行者123 更新时间:2023-12-01 23:33:52 25 4
gpt4 key购买 nike

这个问题是关于 Backbone 0.9.2

自从升级到 Backbone 0.9.10 后,我们选择覆盖 Backbone.sync,它的作用就像一个魅力。

  • 2012 年 12 月 - (v0.9.9) Backbone.wrapError 已被删除。
  • 2013 年 2 月 - 看起来 WrapError 将在下一个版本的 Backbone 中被带回,但重写backbone.sync 是要走的路。


  • (抱歉阅读太长)

    我正在修改 Backbone.wrapError 函数,但被一行代码搞糊涂了。我知道这条线的作用,但不知道为什么有必要。
      resp = model === originalModel ? resp : model;
  • resp 最终成为 textStatus/errorType ie: "error""timeout"
    “解析错误”
  • 模型是 XHR 请求对象
  • originalModel 是对最终调用此函数的 Backbone.Model 实例的引用

  • 我很好地掌握了 Backbone.wrapError 的作用、返回的内容以及如何使用它,但我似乎无法理解上述行的目的。

    Backbone 的文档指出 wrapError 将“用回退错误事件包装一个可选的错误回调”,这是真的。此外,我了解到 Backbone.wrapError 在库中的 fetch、save、destroy 和 reset 函数中被调用了 4 次,以确保库不会忽视 AJAX 错误。例如,如果将 AJAX 错误回调传递给 fetch 方法,它将在传递一些参数的情况下执行,否则,模型将使用传递的相同参数触发错误事件。

    示例调用:
    options.error = Backbone.wrapError(options.error, model, options);

    Backbone.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);
    }
    };
    };

    此行 ( resp = model === originalModel ? resp : model; ) 出现的问题是 model 和 resp 对应于 jQuery/Zepto 错误回调参数列表中的前 2 个参数。我遇到的第一个问题是这些参数的命名(模型、响应),因为在调试时我看到这两个参数是 jqXHR/xhrtextStatus/errorType . textStatus/errorType 参数通常以“错误”结束,但(根据文档)也可以是“超时”“解析错误”等。 model === originalModel 的比较对我来说毫无意义。 XHR 对象和 Backbone.Model 实例的硬比较将始终失败,并且 model将存储到 response (resp),这很好,因为 model实际上是 XHR 响应对象...这一行对我来说似乎毫无意义,但我继续将其包含在我修改后的 wrapError 方法中。

    因为 model === originalModel总是评估为假,该行似乎是 resp = 模型的精心版本;这是无用的,因为您可以完全删除该行和 model参数可以传入 originalModel.trigger('error', originalModel, resp, options);而不是 resp .

    有没有 model === originalModel 的实例可能评估为真的?

    任何在 Backbone.js、AJAX 方面有更多经验的人都会回答/解释为什么需要这条线?

    最佳答案

    TLDR/悬崖:

    下面奇怪的小行用于确定错误回调是由模型级别的失败验证触发的天气,还是来自 fetch、save 或 destroy 方法(都调用 Backbone.sync)的失败 AJAX 调用。如果失败来自验证,它不会更改 resp 变量,因为 resp 应该已经保存了验证返回的有用信息(例如错误数组或有关错误的字符串)。如果失败来自错误的 AJAX 请求,则 XHR 对象将存储到 resp 中,因为 XHR 是可用信息最多的项目。不幸的是,XHR 作为模型传递到这个函数中,而 Backbone 文档没有指出这个参数并不总是代表一个模型。 Resp 旨在保存有关错误的有用响应信息,并发送到错误回调或抛出的错误事件。

    好的。我从这条奇怪的线路中学到了一些东西。

    resp = model === originalModel ? resp : model;

    在 Backbone 中有 AJAX 错误和验证错误。方便的是,Backbone 将两个错误汇集到同一个函数中——AJAX 错误回调。问题在于传递给这些函数的参数不一致。当出现 AJAX 错误时,XHR 对象可用,但在验证错误期间不可用。
  • 如果没有回调存在,Backbone 将抛出和 'error' 事件,其参数与传递到错误回调中的参数相同。 (下面的第 7 行和第 9 行)。

  • 在成功的 AJAX 请求之后,您的 JSON 数据可以选择性地通过模型的验证函数传递。在 Backbone 中,验证函数 should return false or nothing at all when there are no errors .当出现错误时,通常会返回一个数组,例如 ['invalid username', 'password too long', 'etc...']从validate 返回的任何东西(通常是一个错误消息数组)都作为 resp 传递到'wrapped' 错误回调中。参数 模型本身被传递为 model !

    _validate 函数有点草率,有多个 return 语句,但是当验证失败时,第 9 行被命中。 _validate的第9行函数通过 this (模型), error (从模型验证方法返回), options (ajax 选项、成功、错误、超时等)。这与传入 xhr 的 AJAX 错误不同。 (xmlhttprequest 对象), errorType ('错误' '超时' '解析错误' 等), options (ajax 选项)。
    validate error:   error(model, validate_return_value, options)
    ajax error: error(xhr, errorType, options)

    1 _validate: function(attrs, options) {
    2 if (options.silent || !this.validate) return true;
    3 attrs = _.extend({}, this.attributes, attrs);
    4 var error = this.validate(attrs, options);
    5 if (!error) return true;
    6 if (options && options.error) {
    7* options.error(this, error, options);
    8 } else {
    9 this.trigger('error', this, error, options);
    10 }
    11 return false;
    12 }

    上面这行奇怪的代码是必要的,因为这个函数处理来自 2 种不同方法的错误。 AJAX 和验证。这两个向它发送不同的参数,因此这是为了规范它们并使用一致的参数列表抛出事件。
    When a validation error occurs, the model does not change所以 model传递给错误回调 完全等于 originalModel . resp的目的参数是保存有关错误本身的信息。当出现 AJAX 错误时,'timeout'、'parse error' 或 'error' 就没有 XHR 对象那么丰富的信息。

    那条奇怪的小线决定了错误回调是从 _validate 访问的天气。或通过正常的 AJAX 错误,例如 404。从validate访问时, resp是从验证返回的值。对于要显示的前端模板,它应该是信息丰富且有用的数据。当产生的错误来自 HTTP 错误时,有关该错误的最有用信息是作为 MODEL 参数传递到此函数中的 XHR 对象。

    一种有望简化 wrapError 和验证函数的方法
       Backbone.wrapError = function(ajax_error_callback, model_or_xhr, ajax_options) {
    return function(model_or_xhr, error_info) {
    if there was an ajax error, error_info = the xhr object
    if there was a validation error, error_info = whatever was returned from validate
    if there's an error callback {
    run the error callback with (the original model, error_info, ajax_options) as parameters
    if there is not an error callback
    throw an event called 'error' with (the original model, error_info, ajax_options) as parameters
    }
    };
    };

    原来的:
       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);
    }
    };
    };

    * 显示从这里调用的错误回调

    关于ajax - Backbone.js Backbone.wrapError 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12395699/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com