提问者:小点点

在异步函数内部设置全局变量的值还是在promise内部设置全局变量的值?[副本]


首先我想问一下这是不是可能的,设置值为全局变量在异步函数或承诺?

如果是,那么为什么每个可用的教程/网站都在教程中使用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

共2个答案

匿名用户

如果您希望访问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"
});

还有一个等待的例子,可能就是你要找的:

  • 将所有内容包装到一个立即调用的异步函数中,这样我们就可以使用awaitinside
  • 保存。然后承诺到一个变量中(显然,您可以完全省略该变量,直接等待)
  • 等待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'