【问题标题】:Propagation of jquery/ajax promises in Durandal在 Durandal 中传播 jquery/ajax 承诺
【发布时间】:2015-04-15 23:24:39
【问题描述】:

我正在使用 durandal.. 我有一个基本控制器来管理对服务器的调用......每个控制器,专门针对每个用例,使用基本控制器来调用服务器。 在基本控制器中,我有以下代码:

self.call = function (url, type, data, success) {
    return Q.when(
        $.ajax({
            ...
            error: function (jqXHR, textStatus, errorThrown) {
                if (jqXHR.status == 500) {
                   // Do some work
                }
            }
        })
     );

然后,在我的专用控制器中,我有

myController.execute(command)
      .then(function () {
            //Do work ok
       })
        .fail(function (data) {
             //Manage error
       });

execute方法,内部调用我一开始写的call方法... 这个解决方案的问题是,当我在基本控制器中管理错误时,我还要在专用控制器中执行fail 代码...

我尝试的另一种方式...在基本控制器中

self.call = function (url, type, data, success) {
    return Q.fail(function (jqXHR, textStatus, errorThrown) {
        if (jqXHR.status == 500) {
             app.showError("a new error");
        }
         else 
             throw { "jqXHR": jqXHR, "textStatus": textStatus, "errorThrown": errorThrown };
    });

在这种情况下,then 代码在专用控制器中执行。在这种情况下,如何避免停止 Promise 的传播?

谢谢

【问题讨论】:

  • 为了继续传播错误(导致 .then 履行处理程序不执行),您可以重新抛出错误。
  • 不...我要停止传播
  • Q.whenQ.fail是什么,你在用Q吗?
  • 是的..也许正确的问题是如何阻止Q“promise”的传播

标签: jquery ajax promise durandal


【解决方案1】:

不要这样做:

myController.execute(command)
      .then(function () {
            //Do work ok
       })
        .fail(function (data) {
             //Manage error
       });

你应该这样做:

myController.execute(command)
      .then(function (data) {
            //Do work ok
       }, function (reason) {
            //error handled 
            //you need to manully throw error here if you want the error to be propagated
            //throw reason; 
       });

更新 您不必用 q 包装 jquery 承诺,这是另一种方法:

self.call = function (url, type, data, success) {
  var result = Q.defer();

  $.ajax({
     success: function (data) {
        result.resolve(data);
     },
     error: function (jqXHR, textStatus, errorThrown) {
       if (jqXHR.status == 500) {
          console.log('error 500, handled');
       } else {
          result.reject(textStatus);
       }
    }
  });

  return result;
}

这样你可以有条件地“传播”你的错误,虽然我不建议这样做,因为未决的承诺(既没有解决也没有拒绝)可能是内存泄漏的潜在来源。

【讨论】:

  • 不...我想我没有清楚地解释我的问题..有人还更改了我认为现在错误的标题...我有一个管理呼叫的集中点到服务器...如果我收到错误 500,我想在这一点上管理错误,即集中式(当我执行 Q.whenQ.fail 时)...。在所有其他情况下,我想传播failmyController 中的错误 .... 更清楚一点... 我想进入 failmyControllerfunction(reason) 中,当它不是错误时 500
  • 你知道你可以设置一个全局的 jQuery ajax 错误处理程序吗?您可以使用本地错误处理程序并重新抛出您不想在本地处理程序中处理的任何内容。
猜你喜欢
  • 2015-10-31
  • 2018-10-22
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多