当前位置: 首页 > 知识库问答 >
问题:

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

马庆
2023-03-14

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

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

习淇
2023-03-14

这会将全局变量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'
祁英哲
2023-03-14

如果您希望访问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"
})();
 类似资料:
  • 问题内容: 我正在使用函数,这样我的程序就不会一团糟,但我不知道如何将局部变量变成全局变量。 问题答案: 这是两种实现相同目的的方法: 使用参数并返回(推荐) 运行时,将获得以下输出 使用全局变量(永远不要这样做) 现在您将获得:

  • 我使用的是swing,有一个函数(CreateAndShowGUI())可以监听上、左、右键的按下 现在,当我运行程序并按下任意键(向上、向左、向右、向下)时,我可以看到按下的键变量被设置为True。但当我试图在main中访问相同的内容时,按下的这个键的值为false。谁能帮我找出我错的地方吗?

  • 主要内容:局部变量,全局变量,局部变量和全局变量的综合示例在《 C语言形参和实参的区别》中提到,形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量的作用域非常有限,只能在函数内部使用,离开该函数就无效了。 所谓 作用域( Scope ) ,就是变量的有效范围。 不仅对于形参变量,C语言中所有的变量都有自己的作用域。决定变量作用域的是变量的定义位置。 局部变量 定义在函数内部的变量称为 局部变量(Local Variable) ,

  • 问题内容: 我试图在量角器上设置一个全局变量,以在所有描述块中使用。 但这返回了以下错误: 我也看了这个问题:量角器angularJS全局变量 所以我试图以这种方式在conf.js中设置变量glob: 仍然有相同的错误。 如何在量角器测试中正确添加全局变量? 问题答案: 可以借助属性从量角器配置文件设置全局变量: 您可以使用规范中访问它。 请参阅参考配置文件。 params对象将直接传递到Prot

  • 问题内容: 这(我的代码的简化版本)不起作用: 为什么?我要访问,因为如果失败,我想在上面记录错误。 递归地调用自身以创建目录列表,因此我担心将整体传递给自身(如中所述)可能会损害性能。 有没有一种方法可以在不传递参数的情况下访问内部?(PHP 5.2.x +) 编辑: 如果代码看起来像这样呢? 问题答案: 您必须将其传递给函数: 或将其声明为global: 如果变量不是全局变量,而是在外部函数中

  • 问题内容: 我了解Python中局部变量和全局变量的概念,但是我只是有一个问题,为什么下面的代码中会出现错误?Python逐行执行代码,因此在读取第5行之前,它不知道a是局部变量。Python尝试执行第5行后,会回退一行并将其标记为错误吗? 问题答案: 设置和测试 为了分析您的问题,让我们创建两个独立的测试函数来复制您的问题: 版画。因此,调用此函数不是问题,而是在下一个函数上: 我们收到一个错误