Javascript 从angularjs中的嵌套成功函数返回值
我试图从代码上的嵌套函数返回一个值,但每当我试图显示它时,它都会返回未定义的值。这是我的密码:Javascript 从angularjs中的嵌套成功函数返回值,javascript,angularjs,function,nested-function,Javascript,Angularjs,Function,Nested Function,我试图从代码上的嵌套函数返回一个值,但每当我试图显示它时,它都会返回未定义的值。这是我的密码: var calculateAlbum = function (albumPath,albumName) { return photoService.getPhotos(albumPath,albumName) .success(function (data){
var calculateAlbum = function (albumPath,albumName) {
return photoService.getPhotos(albumPath,albumName)
.success(function (data){
var status = data.myphotos.status;
if(status == "ok"){
photoService.myphotosPhotoList()
.success(function(data){
$scope.allPhotoListTotal = {};
var getAllPhotoList = data.config.nas_sharing;
$scope.allPhotoListTotal = getAllPhotoList.count;
});
}
});
}
返回一个值:
calculateAlbum(albumPath,fileName).then(function(data) {
var gettotal = $scope.allPhotoListTotal;
console.log(gettotal);
});
在控制台中返回值之后。它让我感到不确定。实现这一点的最佳方法是什么?您的代码中有两个承诺,但您只是将第一个(外部)承诺链接起来。你的内心承诺设定了你想要的价值,因此你需要等待你的内心承诺得到解决,然后才能使用它 一种方法是注入promise服务
$q
,然后返回您自己的promise对象
var calculateAlbum = function (albumPath,albumName) {
var deferred = $q.defer();
photoService.getPhotos(albumPath,albumName)
.success(function (data){
var status = data.myphotos.status;
if(status == "ok"){
photoService.myphotosPhotoList()
.success(function(data){
var getAllPhotoList = data.config.nas_sharing;
$scope.allPhotoListTotal = getAllPhotoList.count;
deferred.resolve(data)
});
}
});
return deferred.promise;
}
您的代码中有两个承诺,但您只是将第一个(外部)承诺链接起来。你的内心承诺设定了你想要的价值,因此你需要等待你的内心承诺得到解决,然后才能使用它 一种方法是注入promise服务
$q
,然后返回您自己的promise对象
var calculateAlbum = function (albumPath,albumName) {
var deferred = $q.defer();
photoService.getPhotos(albumPath,albumName)
.success(function (data){
var status = data.myphotos.status;
if(status == "ok"){
photoService.myphotosPhotoList()
.success(function(data){
var getAllPhotoList = data.config.nas_sharing;
$scope.allPhotoListTotal = getAllPhotoList.count;
deferred.resolve(data)
});
}
});
return deferred.promise;
}
calculateAlbum返回一个
承诺
,该承诺在外部调用完成时实现,但它不考虑内部执行。您需要在内部success函数中返回一个promise
,以便等待另一个异步方法。在这里,我们利用$q
的强大功能来做到这一点
var calculateAlbum = function (albumPath,albumName) {
return photoService.getPhotos(albumPath,albumName)
.success(function (data){
var status = data.myphotos.status;
var defer = $q.defer();
if(status == "ok"){
photoService.myphotosPhotoList()
.success(function(data){
$scope.allPhotoListTotal = {};
var getAllPhotoList = data.config.nas_sharing;
$scope.allPhotoListTotal = getAllPhotoList.count;
defer.resolve(); //Async execution end here
})
.error(defer.reject);
}
else
defer.reject();
return defer.promise;
});
}
注意:这是一种反模式,但没有其他方法,因为photoService.myphotosPhotoList()
只执行部分时间
编辑:实际上还有其他方法。看一看icycool的解决方案calculateAlbum返回一个
承诺
,该承诺在外部调用完成时实现,但它不考虑内部执行。您需要在内部success函数中返回一个promise
,以便等待另一个异步方法。在这里,我们利用$q
的强大功能来做到这一点
var calculateAlbum = function (albumPath,albumName) {
return photoService.getPhotos(albumPath,albumName)
.success(function (data){
var status = data.myphotos.status;
var defer = $q.defer();
if(status == "ok"){
photoService.myphotosPhotoList()
.success(function(data){
$scope.allPhotoListTotal = {};
var getAllPhotoList = data.config.nas_sharing;
$scope.allPhotoListTotal = getAllPhotoList.count;
defer.resolve(); //Async execution end here
})
.error(defer.reject);
}
else
defer.reject();
return defer.promise;
});
}
注意:这是一种反模式,但没有其他方法,因为photoService.myphotosPhotoList()
只执行部分时间
编辑:实际上还有其他方法。看一看icycool的解决方案你忘了归还承诺的
photoService.myphotosPhotoList
当状态不正常时,您还忘记拒绝第一个承诺(您可以测试这种情况)
你忘了归还photoService.myphotosPhotoList的承诺 当状态不正常时,您还忘记拒绝第一个承诺(您可以测试这种情况)
你需要仔细阅读你的承诺。最可能发生的情况是,您正在尝试在异步请求解析之前使用一个值。基本上,你是想在拿到薪水之前花钱。你需要仔细阅读你的承诺。最可能发生的情况是,您正在尝试在异步请求解析之前使用一个值。基本上,你是想在得到报酬之前花钱。你可以回报内心的承诺,这样只有当内心的承诺解决时,外在的承诺才会解决:我知道,我不知道你可以使用
$q.reject/resolve
而不使用延迟实例。你可以返回内部承诺,这样外部承诺只有在内部承诺解决时才会解决:我知道,我不知道你可以使用$q.reject/resolve
而不使用延迟实例。当我将成功改为。。即使我曾经定义过状态,它也没有定义。所以我把它带回了成功,但仍然导致我未定义。@Amboom在google中搜索了很长时间后,我找不到一个使用.success
的例子,它不是来自$http
服务。您可以修改它,使其使用.success
而不是。然后
?或者更好,您可以更改您的函数,使其使用。然后改为。我刚才使用了一个自定义服务返回$http:photoService.myphotosPhotoList()
。。但不管怎样我真的很感激你帮助我的努力。。在你的帮助下,它正在工作。。谢谢,不客气。虽然解决别人的问题让人感到满意,但如果我能同时向你展示最佳实践,那就更令人满意了。在angular world中使用.then
而不是.success
是一种更常见的做法(您可以在google中搜索then vs success
)。当我把成功改为承诺时,请随时提出与承诺有关的任何进一步问题。。即使我曾经定义过状态,它也没有定义。所以我把它带回了成功,但仍然导致我未定义。@Amboom在google中搜索了很长时间后,我找不到一个使用.success
的例子,它不是来自$http
服务。您可以修改它,使其使用.success
而不是。然后
?或者更好,您可以更改您的函数,使其使用。然后改为。我刚才使用了一个自定义服务返回$http:photoService.myphotosPhotoList()
。。但不管怎样我真的很感激你帮助我的努力。。在你的帮助下,它正在工作。。谢谢,不客气。虽然解决别人的问题让人感到满意,但如果我能同时向你展示最佳实践,那就更令人满意了。在angular world中使用.then
而不是.success
是一种更常见的做法(您可以在google中搜索then vs success
)。请随时提出与承诺相关的任何进一步问题。