Javascript $q和解析角度的承诺
我不知道怎样才能兑现诺言。我尝试使用嵌套方法返回结果,但更希望使用两种不同的方法返回结果,如下所示:Javascript $q和解析角度的承诺,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,我不知道怎样才能兑现诺言。我尝试使用嵌套方法返回结果,但更希望使用两种不同的方法返回结果,如下所示: $scope.relatedContacts = function (accountId) { if (!lodash.isNil(accountId)) { try { return restangular.one('user')
$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'
"
谢谢大家首先,记住一致性。在某些情况下,
isNil
if使函数不返回任何内容(当未提供accountId
时,您将得到TypeError:Cannot read属性'then'of undefined“
error)
你有两种方法来解决你的问题
第一种方式:
$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
服务的官方参考资料:
有许多典型承诺用法的示例。首先,请记住一致性。
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);
}
}
});
};
第二种方式(使用延迟)。
$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
服务的官方参考资料:
有许多典型的promise用法示例。这就是我用来返回值并添加额外方法来处理响应的方法
$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;
};
这就是我用来返回值并添加额外方法来处理响应的方法
$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;
};
对于第一个方法,我在控制器中添加了$q,但现在出现了错误:TypeError:$q不是一个函数:。控制器('SelectUserController',['$scope','PubSub','Pnotify','Common.InfiniteListService','SelectUserService','Restanglar','q',函数($scope,PubSub,Pnotify,InfiniteListService,SelectUserService,Restanglar,$q){问题是我想对响应执行一些逻辑:例如,当重新解决承诺时,我想检查其他逻辑。isNil将起作用,因为我仅在帐户不为null时调用该方法。对于第一个方法,我在控制器中添加了$q,但现在出现错误:TypeError:$q不是函数:.controller('SelectUserController'、['scope'、'PubSub'、'Pnotify'、'Common.InfiniteListService'、'SelectUserService'、'Restanglar'、'q',函数($scope、PubSub、Pnotify、InfiniteListService、SelectUserService、Restanglar,$q){问题是我想对响应执行一些逻辑:例如,当重新解决承诺时,我想检查其他逻辑。isNil将起作用,因为我只在account不为null时调用该方法。