首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使函数内的作用域成为全局

使函数内的作用域成为全局
EN

Stack Overflow用户
提问于 2019-03-15 08:09:43
回答 1查看 28关注 0票数 0

我正在尝试访问我的$rootScope.newBloodneeded,但是我不能在函数外部访问它,我尝试了根作用域,所以我可以调用它作为全局,但它仍然给我未定义

.controller('editbloodrequestCtrl', function($scope,Bloodrequest,$rootScope,$routeParams) {
$rootScope.newBloodneeded;

Bloodrequest.getBloodrequest($routeParams.id).then(function(data) {
        if (data.data.success) {
            $scope.newBloodneeded = data.data.bloodrequest.blood_component;
            $rootScope.newBloodneeded = $scope.newBloodneeded;
            //gives me output when I console here
        } else {
            app.errorMsg = data.data.message; // Set error message
        }
    });

console.log($rootScope.newBloodneeded); //gives me undefined

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-15 08:18:19

假设$rootScope工作正常,这是一个异步问题,而不是作用域问题-当您尝试运行:

console.log($rootScope.newBloodneeded); //gives me undefined

...getBloodRequest不一定已经完成了。您可以在then中设置$rootScope.newBloodneeded,它只在getBloodRequest解析之后运行,这可能会在控制台日志完成之后很久很久才会运行。

Bloodrequest.getBloodrequest($routeParams.id).then(function(data) {
            ...
            $rootScope.newBloodneeded = $scope.newBloodneeded;
            ...

您可以尝试的一个有趣的测试是将控制台日志包装在setTimeout中很长一段时间(当您确信getBloodRequest已经完成时)。这应该证明时间是问题所在,而不是函数作用域的问题。

基本上:

setTimeout(() => console.log($rootScope.newBloodneeded), 10000000000) // or whatever timing guarantees completion

这里的解决方案是在.then中链接任何需要$rootScope.newBloodneeded的逻辑。如果这不起作用,您可能希望创建一个可从其他地方访问的Promise。(这超出了这个问题的范围,我们需要更多细节来找出最好的实现)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55173795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档