【问题标题】:$q and resolving promises in Angular$q 和解决 Angular 中的承诺
【发布时间】:2017-03-18 12:09:52
【问题描述】:

我不知道如何兑现承诺。我试图以嵌套方法返回结果,但更愿意以两种不同的方法返回结果,如下所示:

 $scope.relatedContacts = function (accountId) {
                if (!lodash.isNil(accountId)) {
                    try {
                        return restangular.one('user')
                       .one('contactimages')
                       .get({ 'mappedRelatedContactsPath': $scope.mappedRelatedContactsPath, "account": accountId })
                       .then(function (response) {
                             return response.data;});
                }
            }

希望修复以下示例:

$scope.relatedContacts = function (accountId) {

                        if (!lodash.isNil(accountId)) {

                            try {
                                var deferred = $q.defer();
                                    return restangular.one('user')
                                   .one('contactimages')
                                   .get({ 'mappedRelatedContactsPath': $scope.mappedRelatedContactsPath, "account": accountId })
                                    return deferred.promise;
                                }
                            catch (err) {
                                $scope.contactsPopulated = false;
                            }
                        }
                    }

     $scope.relatedContacts().then(function (response) {
          //Some logic here          
    }

目前我得到:“TypeError:无法读取未定义的属性'then' "

谢谢大家

【问题讨论】:

    标签: javascript angularjs promise angular-promise


    【解决方案1】:

    首先,请记住一致性。 isNil if 使您的函数在某些情况下不返回任何内容(当未提供 accountId 时,您将收到 TypeError: Cannot read property 'then' of undefined " 错误。

    您有两种方法可以解决您的问题。

    第一种方式:

    $scope.relatedContacts = function (accountId) {
      return $q(function(resolve, reject) {
        if (!lodash.isNil(accountId)) {
          try {
            return restangular.one('user')
              .one('contactimages')
              .get({ 'mappedRelatedContactsPath': $scope.mappedRelatedContactsPath, "account": accountId })
              .then(function(response) {
                resolve(response.data)
              }, reject);
          }
          catch (err) {
            $scope.contactsPopulated = false;
            reject(err);
          }
        }
      });
    };
    

    第二种方式(使用defer)。

    $scope.relatedContacts = function (accountId) {
      var def = $q.defer();
      if (!lodash.isNil(accountId)) {
        try {
          restangular.one('user')
            .one('contactimages')
            .get({ 'mappedRelatedContactsPath': $scope.mappedRelatedContactsPath, "account": accountId })
            .then(function(response) {
              def.resolve(response.data)
            }, def.reject);
        }
        catch (err) {
          $scope.contactsPopulated = false;
          def.reject(err);
        }
      }
      return def;
    };
    

    您应该查看有关$q 服务的官方参考: https://docs.angularjs.org/api/ng/service/$q

    有许多典型的 Promise 用法示例。

    【讨论】:

    • 对于第一种方法,我在控制器中添加了 $q 但现在出现错误:TypeError: $q is not a function : .controller('SelectUserController', ['$scope', 'PubSub', 'Pnotify'、'Common.InfiniteListService'、'SelectUserService'、'Restangular'、'$q'、函数($scope、pubSub、pnotify、InfiniteListService、selectUserService、restangular、$q){
    • 问题是我想对响应执行一些逻辑:例如;当承诺被解决时,我想检查额外的逻辑。
    • isNil 将起作用,因为我仅在帐户不为空时才调用该方法。
    【解决方案2】:

    这是我用来返回值并添加额外的方法来处理响应的。

     $scope.relatedContacts = function (accountId) {
    
                            var deferred = $q.defer();
                            if (!lodash.isNil(accountId)) {
    
                                try {
    
                                    deferred.resolve(restangular.one('user')
                                       .one('contactimages')
                                       .get({ 'mappedRelatedContactsPath': $scope.mappedRelatedContactsPath, "account": accountId }));
    
                                }
                                catch (err) {
                                    $scope.contactsPopulated = false;
                                    deferred.reject(err);
                                }
                            }
                            deferred.promise.then(function (response) {
                                var tests = response;
                                return $q.when();
                            },
                           function () {
                               console.log("1st reject");
                               return $q.reject();
                           });
                            return deferred.promise;
    
                        };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 2015-12-06
      • 2015-05-12
      • 1970-01-01
      相关资源
      最近更新 更多