【问题标题】:Passing Promise as parameter doesn't trigger then or fail callbacks将 Promise 作为参数传递不会触发 then 或 fail 回调
【发布时间】:2015-11-20 20:33:16
【问题描述】:

即使我能够将 promise 作为参数传递给错误函数,它也不会触发调用者的 then & error 函数。?

如果我更改代码以将 AJAXError 函数内联,一切正常。

是否可以将 Promise 作为参数传递,并且仍然能够在那时触发并在链中的调用者上失败。

注意:promise 是从 PalletizerService.addSerialNumberToPallet 返回的,但在不同的函数 AjaxFailed 中解决/拒绝。

palletizerService.addSerialNumberToPallet ('p1','s1')
.then(  function (response){
    console.log('success');
},
function(error){
    console.error(error);
});

下面是我从上面的代码调用的服务

palletizerService.addSerialNumberToPallet = function (palletID, serialNumber) {
var deferred = $q.defer();

$.ajax({
    url: url,
    type: "GET",
    dataType: "json",
    methodName: methodName,
    deferred: deferred.promise,
    data: "palletID=" + palletID + "&serialNumber=" + serialNumber, 
    timeout: 20000, // 20 seconds for getting result, otherwise error.
    error: AjaxFailed,
    complete: function (jqXHR, textStatus) {
        console.log("Ajax-finally : " + methodName);
    },
    beforeSend: function (qXHR, settings) {
    },
    success: function (data, textStatus, jqXHR) {
        console.log("Ajax-Sucess " + methodName);
        deferred.resolve(data);
    }
});

return deferred.promise;
};

这是外部函数

function AjaxFailed(qXHR, textStatus, errorThrown) {

try {
    console.error('Ajax-Error in ' + methodName, qXHR.status, qXHR.responseText);

} catch (e) {
    console.log("LocalMethod-Error in " + methodName);
    console.error(e);
}
finally {
    this.deferred.reject(qXHR);
}

}

【问题讨论】:

  • 使用已经返回$q 承诺的$http 会更有意义。您正在混合承诺库并创建反模式。 jQuery 承诺与您的 $q.defer 不同

标签: javascript jquery angularjs promise angular-promise


【解决方案1】:

您的问题是您将 promise 作为选项对象的 .deferred 属性传递。您无法解决/拒绝承诺,它们没有 .reject 方法(并且您的代码在尝试调用它时应该抛出)。相反,您需要传递您持有的 deferred 对象。

但是,无论如何,这是一个坏主意。由于jQuery.ajax 已经返回了一个promise,你应该简单地使用$q.when 来吸收它:

function (palletID, serialNumber) {
    return $q.when($.ajax({
         …
    }));
}

(您将能够省略所有 successerrror 处理程序,angular-promise 会处理它们;如果您想添加转换或日志记录,请按照承诺执行)。

但这仍然不是最佳选择,事实上几乎没有理由使用jQuery.ajax。只需使用 Angular 的 $http service,它也会立即返回一个 Angular 承诺。

【讨论】:

    猜你喜欢
    • 2017-06-08
    • 2017-01-30
    • 2019-04-13
    • 2020-07-25
    • 2019-02-22
    • 2018-06-05
    • 2020-12-14
    • 2014-04-03
    • 2014-09-17
    相关资源
    最近更新 更多