在$ q中用AngularJs回调一个承诺?
我使用下面的代码为了简化后端请求,但我没有看到如何调用成功方法或错误方法。
我如何才能达到代码中所评论的预期行为?
app.factory('REST', function ($http, $q, sweetAlert) { return { load: function (module, action, data) { var deferred = $q.defer(); var promise = deferred.promise; $http .post('/api/'+module+'.php?action='+action, data) .success(function (data) { if(data.error) { sweetAlert.swal({ title: "Error", text: data.error, type: "warning" }); //HERE I WANT TO CALL .error(details) } else deferred.resolve(data.result); }).error(function () { //HERE I WANT TO CALL .error(details) }); promise.success = function(fn) { promise.then(fn); return promise; } return promise; } }; });
这是使用上面的代码的代码:
$scope.login = function () {
$scope.loading = true;
var payload = {'credentials': $scope.logindata};
REST.load('access', 'login', payload).success(function(data) {
if(data.redirect)
$state.go(data.redirect);
$scope.loading = false;
}).error(function(data) { //THIS SHOULD BE CALLED
$scope.loading = false;
});
}
首先,我强烈建议你不要附上你所.success
的承诺。 这不符合Promises / A标准,与.then
(如$http
实现)之间的细微差别导致了很多混淆。 只是回报一个纯粹的承诺。
除此之外,还有一些需要注意的事项:
1)你不需要另一个$q.defer
和deferred.resolve()
- 只需链接到$http
的原始承诺并return
所产生的承诺。 (请参阅延迟反模式)
2)拒绝承诺 - 也就是导致.catch
(不是.error
- 请参阅上面有关细微差别的内容)触发 - 您应该返回$q.reject()
。
以上所有产生以下内容:
app.factory('REST', function($http, $q, sweetAlert){
return {
load: function(module, action, data) {
// this "return" returns the promise of $http.then
return $http.post('/api/' + module + '.php?action=' + action, data)
.then(function(response) {
var data = response.data; // .then gets a response, unlike $http.success
if (data.error) {
sweetAlert.swal({
title: "Error",
text: data.error,
type: "warning"
});
//HERE I WANT TO CALL .error(details)
return $q.reject(data.error);
}
return data.result; // what you would have "resolved"
});
}
};
})
然后,正如我上面所说的.then
像承诺一样使用.catch
/ .catch
:
$scope.login = function () {
$scope.loading = true;
var payload = {'credentials': $scope.logindata};
REST.load('access', 'login', payload)
.then(function(data) {
if(data.redirect)
$state.go(data.redirect);
$scope.loading = false;
})
.catch(function(error) {
$scope.loading = false;
});
}
更新年代码如下
app.factory('REST', function ($http, $q, sweetAlert) {
return {
load: function (module, action, data) {
var deferred = $q.defer();
$http.post('/api/'+module+'.php?action='+action, data)
.success(function (data) {
if(data.error)
{
sweetAlert.swal({
title: "Error",
text: data.error,
type: "warning"
});
//HERE I WANT TO CALL .error(details)
deferred.reject(data.error);
}
else{
deferred.resolve(data.result);
}
})
.error(function (error) {
//HERE I WANT TO CALL .error(details)
deferred.reject(error);
});
return defferred.promise;
}
};
});
为年控制器
$scope.login = function () {
$scope.loading = true;
var payload = {'credentials': $scope.logindata};
REST.load('access', 'login', payload).then(
function(data) {
if(data.redirect)
$state.go(data.redirect);
$scope.loading = false;
},
function(error) {
$scope.loading = false;
});
}
链接地址: http://www.djcxy.com/p/55457.html