我想更改我在库中调用的变量的值,但它看起来像是由于某个范围问题导致的,我无法这样做。我的代码如下所示:更改库调用中的外部变量值
var data = "";
abc.abc(lat, long).then(function(x) {
data = x;
console.log(data);
});
console.log(data);
第一个输出显示x的值,但第二个输出仍为空。我究竟做错了什么?
注意:abc是使用承诺的外部库。
我想更改我在库中调用的变量的值,但它看起来像是由于某个范围问题导致的,我无法这样做。我的代码如下所示:更改库调用中的外部变量值
var data = "";
abc.abc(lat, long).then(function(x) {
data = x;
console.log(data);
});
console.log(data);
第一个输出显示x的值,但第二个输出仍为空。我究竟做错了什么?
注意:abc是使用承诺的外部库。
在分配之前,您不能引用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框架(如果有的话)
谢谢我不确定承诺是如何工作的。现在明白了。现在重新编写我的代码,以便我可以在使用承诺时使其工作。 – apr
一回事异步编程,请记住,承诺在一定的处理后以后执行不同的最佳实践完成,所以它不是阻塞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);
传递给'。那么()'以后执行,*后*了'的console.log()'就上线,在将来的某个时候任何异步进程'完成后回调.abc()'开始了。这是承诺的点... – nnnnnn
所以我应该不使用承诺呢?任何方式来修改数据? – apr
不,你应该使用承诺 - 事实上,如果外部库的工作方式如此,你可能没有任何选择。但是你需要以一种方式来构建你的代码,无论你想在值为'.then()'回调(或者你在里面调用的函数)内完成你想要做的任何事情。 – nnnnnn