Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从angularjs中的嵌套成功函数返回值_Javascript_Angularjs_Function_Nested Function - Fatal编程技术网

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
)。请随时提出与承诺相关的任何进一步问题。