在异步函数或内部promise中设置全局变量的值?

时间:2019-12-25 10:33:39

标签: javascript node.js promise async-await

首先,我想问一下这是否可行,是否将值设置为异步函数或promise中的全局变量?

如果是,那么为什么每个可用的教程/网站都在教程中使用console.log(results),却从不使用它来将其分配给变量。

例如:

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

3 个答案:

答案 0 :(得分:1)

这会将全局变量myval更改为'foo',但是到console.log(myval);被调用时,由于超时,即使已立即解决了承诺,承诺也尚未得到解决。它仍然只会在console.log(myval);运行后更改它,因为诺言将作为microtask排队。

我将添加一个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'

答案 1 :(得分:1)

如果您要访问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
  • .then承诺保存到变量中
  • await在您的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"
})();

答案 2 :(得分:1)

这与javascript的异步行为有关。请参见下面的代码片段,并注意执行顺序。解决承诺后,value已分配给myval。在您的情况下,您只需要维护一个标志,即可确定该特定的承诺是否得到解决,然后在尝试获取myval变量的值之后,将获得所需的输出。是的,它是实现这一目标的众多方法之一。

let myval="";
var promise1 = new Promise(function(resolve, reject) {
    resolve('foo');
});
promise1.then(function(value) {
    myval=value;
    console.log("Value :" + value);
    console.log("myval after promise : " + myval);
});

console.log("myval before promise : " + myval);