为啥当我使用“require”时我的变量未定义? [复制]

Posted

技术标签:

【中文标题】为啥当我使用“require”时我的变量未定义? [复制]【英文标题】:Why is my variable undefined when I use "require"? [duplicate]为什么当我使用“require”时我的变量未定义? [复制] 【发布时间】:2020-11-06 15:47:51 【问题描述】:

我这里有一个简单的函数来获取 git ID(仅用于测试目的)。从上到下评估变量时,我不明白如何设置变量。它给了我未定义。

var gitID;
require ('child_process').exec ('git rev-parse HEAD', function (err, stdout) 
  gitID = stdout;
);
console.log (gitID);

如何将我的 js 文件顶部的变量设置为 git ID?

【问题讨论】:

问题不是require。这是一个带有回调的异步操作,因此gitID = stdout 行比console.log(gitID) 行运行得晚得多。所以在你做console.log(gitID)的时候,它仍然是未定义的,因为git进程还没有完成,所以你的带有gitID = stdout的回调还没有运行。 【参考方案1】:

如前所述,这是因为您正在进行的调用是使用回调的异步调用,并且console.log(gitID)exec 操作能够完成并返回输出之前完成,因此它是@987654323 @。

解决此问题的一种快速简单的方法是使用promisify util 将exec 包装在:

import  exec  from "child_process";
import  promisify  from "util";

const promisifiedExec = promisify(exec);

promisifiedExec("git rev-parse HEAD").then(res => console.log(res.stdout));

你也可以看看构造一个函数来返回一个承诺,在链接的问题中有很多关于它的信息。

【讨论】:

以上是关于为啥当我使用“require”时我的变量未定义? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

vuex 3.6为啥在方法中使用它时我的状态对象未定义

为啥在将 next.js 与环境变量一起使用时我的 API 密钥可见?

required_once() 中的变量未定义但可与 require() 一起使用,为啥?

为啥当我重载数组运算符时我的私有变量为零? [关闭]

为啥我的输入变量属性未定义(Angular)

为啥在单独的线程中修改时我的变量没有改变? c++/升压