首先我想问一下这是不是可能的,设置值为全局变量在异步函数或承诺?
如果是,那么为什么每个可用的教程/网站都在教程中使用console.log(结果),但从来没有使用它将其赋值给variable。
例如:
var promise1 = new Promise(function(resolve, reject) {
resolve('foo');
});
let myval="";
promise1.then(function(value) {
myval=value;
console.log(value); // this logs "foo"
});
console.log(myval); //this logs blank
如果您希望访问myval
的更改版本(即在Promise中的赋值完成后执行代码),您需要继续执行另一个then
,或者在赋值完成后执行任何其他将代码放入事件队列的操作。
var promise1 = new Promise(function(resolve, reject) {
resolve('foo');
});
let myval="a";
promise1.then(function(value) {
myval=value;
console.log(value); // this logs "foo"
});
setTimeout(() => console.log(myval), 0); // logs "foo"
var promise1 = new Promise(function(resolve, reject) {
resolve('foo');
});
let myval="a";
promise1.then(function(value) {
myval=value;
console.log(value); // this logs "foo"
}).then(function() {
console.log(myval) // logs "foo"
});
还有一个等待的例子,可能就是你要找的:
await
inside。然后
承诺到一个变量中(显然,您可以完全省略该变量,直接等待
)等待
在console.log
(async () => {
var promise1 = new Promise(function(resolve, reject) {
resolve('foo');
});
let myval="";
var thenedPromise = promise1.then(function(value) {
myval=value;
console.log(value); // this logs "foo"
});
await thenedPromise; // wait before the promise generated by "then" is resolved
console.log(myval); // logs "foo"
})();
这会将全局变量myval
更改为'foo'
,但在调用console.log(myval);
时,由于超时,承诺尚未解析,即使您立即解析了承诺,它仍然只能在console.log(myval);
运行后更改,因为承诺将作为微任务排队。
我会添加一个setTimeout来等待分配,或者添加一个setInterval来检查它发生的时间。
var promise1 = new Promise(function(resolve, reject) {
resolve('foo');});
let myval="";
promise1.then(function(value) {
myval=value;
console.log(value); // this logs "foo"
});
setTimeout(() => console.log(myval), 1000); //this logs 'foo'