我正在尝试在Angular中为我的承诺添加一个中止函数。调试代码时,我可以看到函数按预期添加。但是,当对象返回到调用服务时,该函数不再存在。我希望这是微不足道的。
.factory('MatchmakerSearch', ['$resource', 'OBB_ENV_CONF', '$q', function ($resource,
OBB_ENV_CONF, $q) {
// Create the $resource object to handle the API requests
function _query(params) {
var _deferredAbort = $q.defer();
var _request = $resource(OBB_ENV_CONF.API_HOST + 'int/matchMaker', {}, {
'query': {
method: 'GET',
params: params,
isArray: false,
timeout: _deferredAbort.promise
}
});
var _promise = _request.query().$promise.then( // Convert from $resource to $http
function (response) {
return response;
}, function (response) {
return $q.reject('Ajax call aborted');
}
);
_promise.abort = function () {
_deferredAbort.resolve();
};
_promise.finally(function () {
_promise.abort = angular.noop;
_deferredAbort = _request = _promise = null;
});
return _promise; // <~~~~ abort function exists here
}
return {
query: _query
}
}
]);
拨打电话的服务如下:
_searchRequest = MatchmakerSearch.query(buildQueryParams()).then(function (result) {
// <~~~~ _searchRequest does not contain an abort() function.
});
我真的认为编码会很简单。关于为什么我的功能在返回时消失的任何想法?
答案 0 :(得分:1)
每次您使用then
,catch
或finally
链接承诺时,您都会收到新的承诺:
_searchRequest = MatchmakerSearch
.query(buildQueryParams()) // Your customised promise.
.then(function (result) {}) // a new promise returned here.
所以_searchRequest
最终成为一个全新的Promise实例。
documentation for deferred.then()
谈到这个问题:
然后(successCallback,errorCallback,notifyCallback) - ...
此方法返回一个新的promise ,它通过successCallback的返回值解析或拒绝,errorCallback ...
(原文强调)