【问题标题】:How to get variable value outside angular function [duplicate]如何在角度函数之外获取变量值[重复]
【发布时间】:2016-08-14 18:38:38
【问题描述】:

我花了好几个小时试图理解为什么在 Angular.js 函数之外我没有得到变量的值。首先,我从 Firebase 数据库中获取值,这是我的参考:

var refspaedtServ = new Firebase(FBURLSPA + $routeParams.id);
$scope.spaedServ = $firebaseObject(refspaedtServ);

那么我就有了函数:

        /////  IMAGE REFERENCE  ////
        var lafoto = ''; 
        refspaedtServ.on("value", function(rootSnapshot) {
           lafoto = rootSnapshot.val().foto;
           console.log("Inside image ", lafoto)
       });

如您所见,我将变量“lafoto”定义为全局变量 有了console.log里面的图片,我可以看到值是正确的

但是当我尝试在函数之外获取“lafoto”变量的值时,我得到的是“未定义”,我的意思是没有价值。

console.log("Outside Image ", lafoto)

这似乎很愚蠢,但我为此发疯了。 有人可以给我提示吗?

问候, 维克多

【问题讨论】:

  • 看起来像经典的异步问题。看看这是否有帮助stackoverflow.com/questions/14220321/…
  • "value" 事件是异步的。尝试在函数外记录lafoto 变量超时:setTimeout(function(){ console.log(lafoto); }, 1000);
  • 嗨 Pawel,谢谢你的提示,现在我明白我必须等待回复,如果我使用你在评论中提到的 setTimeout,它可以工作,“在”函数“内部”,控制台.log(lafoto) 显示正确的值,但是如果我尝试在 setTimeout 函数之外使用该值,我再次没有得到该值,只是未定义。也许我做的不对,我想做的是获取firebase集合上“foto”字段的数据值,并在存储引用上设置这个值,如下所示: var starsRef = storageRef.child('fotos /'+ lafoto);

标签: javascript angularjs firebase firebase-realtime-database


【解决方案1】:

很简单,我们通过你的代码来看看,假设你在 'value' 事件中的函数需要 1500ms 才能完成:

var lafoto = '';
console.log('start');

//listening for the event
refspaedtServ.on("value", function(rootSnapshot) {
    //after ~1500ms...
    lafoto = rootSnapshot.val().foto;
    console.log("Inside", lafoto)
});

console.log('outside', lafoto); //executed immediately

在控制台中,您将收到以下结果:

'Start'
'outside'
'inside'

那是因为您正在异步等待事件:因此,在 .on 函数“外部”执行代码内部代码之前。

因此,您的变量 lafoto 将始终导致未定义,因为它尚未被分配。

.

编辑 1

您可以使用回调函数在 .on 事件之后执行代码:

 var lafoto = '';
console.log('start');

//listening for the event
refspaedtServ.on("value", function(rootSnapshot) {
    //after ~1500ms...
    lafoto = rootSnapshot.val().foto;
    console.log("Inside", lafoto)
    myAfterFunction();
});

function myAfterFunction(){
    console.log('myAfterFunction', lafoto);
}

console.log('outside', lafoto); //executed immediately

在控制台中,您将收到以下结果:

'Start'
'outside'
'inside'
'myAfterFunction'

【讨论】:

  • 谢谢 Luxor001,你的权利,我必须给它时间得到响应,我创建了另一个函数:setTimeout(function(){ console.log(lafoto); }, 1000);,但又一次我被卡住了,当我尝试在 setTime 函数之外获取值时,我只会得到未定义。你怎么看?
  • 您无法解决另一个异步问题:通过调用 setTimeout 函数,您将异步等待 1000 毫秒以执行函数内部的代码 (console.log(lafoto)。所以,你收到 undefined 因为 lafoto 还没有被分配(你的 setTimeout 函数在 .on("value") 之前被调用)。你需要做的是在 .on("value" 函数中执行你需要的代码) ,因此您可以确定 lafoto 已初始化。
  • 或者,您可以使用回调函数。我将在我的答案中添加代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 2017-04-08
  • 2019-12-29
  • 2017-10-02
相关资源
最近更新 更多