【问题标题】:Promise not returning to controller in Angular承诺不返回 Angular 中的控制器
【发布时间】:2018-04-08 15:23:49
【问题描述】:

我将$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);
      };

}]);

删除文章正在以与添加文章完全相同的方式将承诺返回给控制器,为什么没有相同的行为?提前谢谢..

【问题讨论】:

    标签: angularjs promise factory


    【解决方案1】:

    您的代码很完美,但有一些语法问题。

    正确的顺序如下:

    $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 = {};
    });
    

    【讨论】:

    • @Juanca 如果您遇到任何其他问题,请告知。
    【解决方案2】:

    $http 默认情况下将响应作为承诺发送。无需使用 defer 实例创建新的承诺。只需返回 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
        }
    

    【讨论】:

    • 这怎么能解决 OP 的问题?从技术上讲,这将遵循指南,但这并不能解释为什么 OP 的代码不起作用..
    • 我不希望有任何数据来回应我所知道的,这可能是无效的吗? ArticleService.addArticle($scope.article.title, $scope.article.content, $scope.article.url) .then(function(){ refresh(); // 这是我期望它返回的地方 }跨度>
    猜你喜欢
    • 2015-12-02
    • 2016-07-27
    • 2021-05-04
    • 2014-06-04
    • 2016-10-09
    • 1970-01-01
    • 2019-04-21
    • 2015-11-04
    • 1970-01-01
    相关资源
    最近更新 更多