$ q并解决Angular中的承诺

时间:2016-11-04 15:28:48

标签: javascript angularjs promise angular-promise

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

 $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:无法读取属性'然后'未定义的 "

全部谢谢

2 个答案:

答案 0 :(得分:0)

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

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

第一种方式:

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

第二种方式(使用延迟)。

$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

有许多典型的承诺用法的例子。

答案 1 :(得分:0)

这是我用来返回值并添加其他方法来处理响应。

 $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;

                    };