Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jquery/ajax承诺在Durandal中的传播_Jquery_Ajax_Promise_Durandal - Fatal编程技术网

jquery/ajax承诺在Durandal中的传播

jquery/ajax承诺在Durandal中的传播,jquery,ajax,promise,durandal,Jquery,Ajax,Promise,Durandal,我在用杜兰达尔。。我有一个基本控制器来管理对服务器的调用。。。每个控制器,每个用例专用,都使用基本控制器来调用服务器。 在基本控制器中,我有以下代码: self.call = function (url, type, data, success) { return Q.when( $.ajax({ ... error: function (jqXHR, textStatus, errorThrown) {

我在用杜兰达尔。。我有一个基本控制器来管理对服务器的调用。。。每个控制器,每个用例专用,都使用基本控制器来调用服务器。 在基本控制器中,我有以下代码:

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 };
    });
在这种情况下,
然后
代码在专用控制器中执行。在这种情况下,我如何避免阻止承诺的传播

谢谢你

不要这样做:

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;
}

通过这种方式,您可能会有条件地“传播”错误,尽管我不建议这样做,因为挂起的承诺(未解决或拒绝)可能是内存泄漏的潜在来源

为了继续传播错误(导致
。然后
实现处理程序不执行),您可以重新播放错误。否。。。我想停止传播什么是
Q.when
Q.fail
,您正在使用吗?是。。也许正确的问题是如何阻止Q“承诺”的传播。。。我想我没有清楚地解释我的问题。。有人还更改了我认为现在是错误的标题。。。我有一个集中点,在这里我管理对服务器的调用。。。如果我得到一个错误500,我想在这一点上管理错误,这是集中的(当我做
Q.when
Q.fail
)。。。。在所有其他情况下,我希望在
myController
fail
中传播错误。。。。更清楚地说。。。我想进入
fail
myController
函数(原因)
,只要它不是一个错误,你知道你可以设置一个全局jQuery ajax错误处理程序吗?您可以使用本地错误处理程序,并在本地处理程序中重新显示不希望处理的任何内容。