Javascript 更改库调用内的外部变量值

Javascript 更改库调用内的外部变量值,javascript,scope,Javascript,Scope,我想更改我在库中调用的变量的值,但似乎由于某些范围问题,我无法更改。我的代码如下所示: var data = ""; abc.abc(lat, long).then(function(x) { data = x; console.log(data); }); console.log(data); 第一个输出显示x的值,但第二个输出仍然为空。我做错了什么 注意:abc是一个使用承诺的外部库。在分配数据之前,不能引用数据的值。即使内部函数(x)是在第二个控制台.log之前声明的,它

我想更改我在库中调用的变量的值,但似乎由于某些范围问题,我无法更改。我的代码如下所示:

var data = "";
abc.abc(lat, long).then(function(x) {
    data = x;
    console.log(data);
});
console.log(data);
第一个输出显示x的值,但第二个输出仍然为空。我做错了什么


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

在分配数据之前,不能引用数据的值。即使内部
函数(x)
是在第二个
控制台.log之前声明的,它也是在第二个
控制台.log之后调用的

请参见每个语句执行时间的简化图示,该时间标记在代码旁边,从time=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
底线是,如果您可以通过这种方式同步引用
数据
,那么就不要使用承诺。但是,不建议对可能长期运行的操作使用承诺

您应该采用您的代码,以便只有在承诺得到解决后才能访问
数据


这样做的最佳实践可能因您使用的Javascript框架而异(如果有)

在分配数据之前,您不能引用数据的值。即使内部
函数(x)
是在第二个
控制台.log之前声明的,它也是在第二个
控制台.log之后调用的

请参见每个语句执行时间的简化图示,该时间标记在代码旁边,从time=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
底线是,如果您可以通过这种方式同步引用
数据
,那么就不要使用承诺。但是,不建议对可能长期运行的操作使用承诺

您应该采用您的代码,以便只有在承诺得到解决后才能访问
数据


这样做的最佳实践可能因您使用的Javascript框架而异(如果有的话)

关于异步编程,请记住,承诺是在某些进程完成后执行的,因此它不会阻止向用户发送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);

这都是关于异步编程的,请记住,承诺是在某些进程完成后执行的,因此它不会阻止用户的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);

您传递给
.then()
的回调稍后将在最后一行的
控制台.log()
之后执行,在将来的某个时间点,在任何异步进程
完成后执行。这就是承诺的意义……那个么我不应该使用承诺吗?有什么方法可以修改数据吗?不,你应该使用承诺——事实上,如果外部库是这样工作的,你可能没有任何选择。但是你需要以这样的方式来构造你的代码:无论你想对值做什么,都是在
.then()
回调函数中完成的(或者在你从里面调用的函数中)。明白了。我对承诺不熟悉,所以我不确定回调是如何工作的。谢谢您传递给
.then()
的回调稍后将在最后一行的
控制台.log()
之后执行,在将来的某个时间点,在任何异步进程
完成后执行。这就是承诺的意义……那个么我不应该使用承诺吗?有什么方法可以修改数据吗?不,你应该使用承诺——事实上,如果外部库是这样工作的,你可能没有任何选择。但是你需要以这样的方式来构造你的代码:无论你想对值做什么,都是在
.then()
回调函数中完成的(或者在你从里面调用的函数中)。明白了。我对承诺不熟悉,所以我不确定回调是如何工作的。谢谢谢谢,我不知道承诺是怎么起作用的。现在明白了。现在重新构造我的代码,这样我就可以在使用承诺的同时让它工作。谢谢,我不知道承诺是如何工作的。现在明白了。现在重新构造我的代码,这样我就可以在使用承诺的同时让它工作。