承诺不会在 Angular 内返回控制器
Promise not returning to controller in Angular
我正在将 $q
注入工厂,以便处理来自服务器的所有相关方法和回调。我有一种方法可以将数据添加到 mongoDB 数据库,一切正常我收到了肯定的答复并且我履行了诺言但没有返回到控制器
在控制器中:
$scope.addArticle = function(){
console.log('add article route working');
ArticleService.addArticle($scope.article.title, $scope.article.content, $scope.article.url)
.then(function(){
refresh(); // here is where I am expecting it to return
}
.catch(function(){
$scope.error = true;
$scope.errorMessage = "Something went wrong!";
$scope.article = {};
}));
}
$scope.remove = function(id){
ArticleService.deleteArticle(id)
.then(function(){
refresh();
});
}
在工厂里
myApp.factory('ArticleService',
['$q', '$timeout', '$http',
function($q, $timeout, $http){
var article = null;
return({
addArticle : addArticle,
getArticles : getArticles,
deleteArticle : deleteArticle
});
function addArticle(title, content, imgUrl){
var date = getDatetime();
var deferred = $q.defer();
var article = {
title : title,
content : content,
imgUrl : imgUrl,
date
}
$http.post('user/edit/addArticle', article)
.then(function(response){
if(response.status === 200){
deferred.resolve();
}
});
return deferred.promise;
}
function getArticles(){
var deferred = $q.defer();
$http.get('user/edit/getArticles')
.then(function(result){
deferred.resolve(result.data);
/* article = result.data;
return article; */
}, function(error){
});
return deferred.promise;
}
function deleteArticle(id){
var deferred = $q.defer();
$http.delete('user/edit/deleteArticle/' + id)
.then(function(response){
if(response.status === 200){
deferred.resolve();
}
})
return deferred.promise;
}
function getDatetime() {
return (new Date);
};
}]);
删除文章以与添加文章完全相同的方式将承诺返回给控制器,为什么没有相同的行为?提前致谢..
$http
默认发送响应作为承诺。无需使用 defer
实例创建新的承诺。只是 return http 调用。
function addArticle(title, content, imgUrl){
var date = getDatetime();
var article = {
title : title,
content : content,
imgUrl : imgUrl,
date
}
return $http.post('user/edit/addArticle', article);
}
然后在控制器中抓取数据。
ArticleService.addArticle($scope.article.title, $scope.article.content, $scope.article.url)
.then(function(response){
console.log(response.data)
refresh(); // here is where I am expecting it to return
}
您的代码很完美,但有一些语法问题。
正确顺序如下:
$http.get(url)
.then(function(response) {
// response body
}).catch(function(e) {
// catch block
}).finally(function() {
//finally block
});
在语法上更正了以下代码:
.then(function () {
refresh(); // here is where I am expecting it to return
})
.catch(function () {
$scope.error = true;
$scope.errorMessage = "Something went wrong!";
$scope.article = {};
});
我正在将 $q
注入工厂,以便处理来自服务器的所有相关方法和回调。我有一种方法可以将数据添加到 mongoDB 数据库,一切正常我收到了肯定的答复并且我履行了诺言但没有返回到控制器
在控制器中:
$scope.addArticle = function(){
console.log('add article route working');
ArticleService.addArticle($scope.article.title, $scope.article.content, $scope.article.url)
.then(function(){
refresh(); // here is where I am expecting it to return
}
.catch(function(){
$scope.error = true;
$scope.errorMessage = "Something went wrong!";
$scope.article = {};
}));
}
$scope.remove = function(id){
ArticleService.deleteArticle(id)
.then(function(){
refresh();
});
}
在工厂里
myApp.factory('ArticleService',
['$q', '$timeout', '$http',
function($q, $timeout, $http){
var article = null;
return({
addArticle : addArticle,
getArticles : getArticles,
deleteArticle : deleteArticle
});
function addArticle(title, content, imgUrl){
var date = getDatetime();
var deferred = $q.defer();
var article = {
title : title,
content : content,
imgUrl : imgUrl,
date
}
$http.post('user/edit/addArticle', article)
.then(function(response){
if(response.status === 200){
deferred.resolve();
}
});
return deferred.promise;
}
function getArticles(){
var deferred = $q.defer();
$http.get('user/edit/getArticles')
.then(function(result){
deferred.resolve(result.data);
/* article = result.data;
return article; */
}, function(error){
});
return deferred.promise;
}
function deleteArticle(id){
var deferred = $q.defer();
$http.delete('user/edit/deleteArticle/' + id)
.then(function(response){
if(response.status === 200){
deferred.resolve();
}
})
return deferred.promise;
}
function getDatetime() {
return (new Date);
};
}]);
删除文章以与添加文章完全相同的方式将承诺返回给控制器,为什么没有相同的行为?提前致谢..
$http
默认发送响应作为承诺。无需使用 defer
实例创建新的承诺。只是 return http 调用。
function addArticle(title, content, imgUrl){
var date = getDatetime();
var article = {
title : title,
content : content,
imgUrl : imgUrl,
date
}
return $http.post('user/edit/addArticle', article);
}
然后在控制器中抓取数据。
ArticleService.addArticle($scope.article.title, $scope.article.content, $scope.article.url)
.then(function(response){
console.log(response.data)
refresh(); // here is where I am expecting it to return
}
您的代码很完美,但有一些语法问题。
正确顺序如下:
$http.get(url)
.then(function(response) {
// response body
}).catch(function(e) {
// catch block
}).finally(function() {
//finally block
});
在语法上更正了以下代码:
.then(function () {
refresh(); // here is where I am expecting it to return
})
.catch(function () {
$scope.error = true;
$scope.errorMessage = "Something went wrong!";
$scope.article = {};
});