在Durandal中传播jquery / ajax的承诺

时间:2015-04-14 12:11:48

标签: jquery ajax promise durandal

我正在使用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
       });

执行方法,在内部调用我在开始时编写的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代码在专用控制器中执行。在这种情况下,如何避免停止传播承诺?

谢谢

1 个答案:

答案 0 :(得分:0)

而不是这样做:

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

这样你就可以传播&#34;你有条件地错误,虽然我不推荐这个,因为未决的承诺(既没有解决或拒绝)可能是内存泄漏的潜在来源。