2016-04-24 27 views
0

我想更改我在库中调用的变量的值,但它看起来像是由于某个范围问题导致的,我无法这样做。我的代码如下所示:更改库调用中的外部变量值

var data = ""; 
abc.abc(lat, long).then(function(x) { 
    data = x; 
    console.log(data); 
}); 
console.log(data); 

第一个输出显示x的值,但第二个输出仍为空。我究竟做错了什么?

注意:abc是使用承诺的外部库。

+0

传递给'。那么()'以后执行,*后*了'的console.log()'就上线,在将来的某个时候任何异步进程'完成后回调.abc()'开始了。这是承诺的点... – nnnnnn

+0

所以我应该不使用承诺呢?任何方式来修改数据? – apr

+0

不,你应该使用承诺 - 事实上,如果外部库的工作方式如此,你可能没有任何选择。但是你需要以一种方式来构建你的代码,无论你想在值为'.then()'回调(或者你在里面调用的函数)内完成你想要做的任何事情。 – nnnnnn

回答

1

在分配之前,您不能引用data的值。即使内部function(x)宣称之前第二个console.log它是之后叫

查看执行的时间每个语句的简化插图下一标记的代码,从时间= 0

var data = ""; // time = 0 
abc.abc(lat, long).then(function(x) { 
    data = x; // time = N > 2 (i.e. at this time, the promise has been resolved) 
    console.log(data); 
}); // time = 1 
console.log(data); // time = 2 

底线,如果你能指data同步这样那么不使用承诺。但是,不推荐使用可能长时间运行的承诺。

您应该采用您的代码,以便任何对data的访问仅在承诺解决后才会发生。

这样做可能会根据您所使用的JavaScript框架(如果有的话)

+0

谢谢我不确定承诺是如何工作的。现在明白了。现在重新编写我的代码,以便我可以在使用承诺时使其工作。 – apr

1

一回事异步编程,请记住,承诺在一定的处理后以后执行不同的最佳实践完成,所以它不是阻塞IO给用户,你可以使用加载来告诉用户进程正在执行。

var data = ""; 
//show loading 
//block all input 
abc.abc(lat, long).then(function(x) { 
    data = x; 
    console.log(data); 
    // hide loading 
    // continue the process 
}); 
console.log(data);