Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript/Nodejs在Nodejs模块的顶层使用wait_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript/Nodejs在Nodejs模块的顶层使用wait

Javascript/Nodejs在Nodejs模块的顶层使用wait,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我试图找到问题的解决方案,但找不到,正在寻找一些“最佳实践范例”。我有一个nodejs express应用程序,我的函数被拆分成文件。例如,我有一个控制器(oktacontroller.js): var-okta_-api_-key=; const OKTA_ORG_URL=''; exports.createUser=async(请求、回复)=>{ 日志(okta_api_密钥); } exports.getGroups=async(req,res)=>{ 日志(okta_api_密钥); }

我试图找到问题的解决方案,但找不到,正在寻找一些“最佳实践范例”。我有一个nodejs express应用程序,我的函数被拆分成文件。例如,我有一个控制器(oktacontroller.js):

var-okta_-api_-key=;
const OKTA_ORG_URL='';
exports.createUser=async(请求、回复)=>{
日志(okta_api_密钥);
}
exports.getGroups=async(req,res)=>{
日志(okta_api_密钥);
}
在两个导出的函数(都是快速路由)中,我都需要var-okta_-api_键。我知道我可以通过在这两个函数中查询它们来获得它们,因为它们是异步函数,我可以在那里使用wait,但是每次查询都感觉很愚蠢(因为它永远不会改变)

我该怎么办?我知道我能做到:

var-okta_-api_-key;
(异步()=>{
okta_api_key=等待
})()
但这也让人感觉不舒服

是否有任何方法也可以生成某种大型函数(异步)并导出这两个函数?换句话说:如何在文件(模块)的顶层使用wait。它不需要位于顶层(这是不可能的),而是某种方法,将我的“顶层”变量公开给我导出的函数

编辑:其他一些用例,因为我得到了把它放在配置文件中的建议。是的,对于这个是可能的,但例如:我有一些其他api密钥,它在每次启动时从服务本身获取他的访问令牌(因为它过期)。该令牌不能存储在配置文件中,因此我需要一些异步工作来获取该值。我知道top level await不起作用(甚至不可取),但我只想举一个例子,说明如果是你的项目,你们会怎么做:)

你很接近:

 var okta_api_key = (async () => {
    return  await <getting key async>
 })();
var-okta\u-api\u-key=(异步()=>{
返回等待
})();
创建一个承诺,然后在你想使用它时等待该承诺

如何在文件(模块)的顶层使用wait

顶级
await
可能看起来很棒:您只需添加一个
await
,然后就可以同步访问变量。但这太过简化了:它将停止依赖于该模块的所有模块的执行。在大多数情况下,您不希望这样。相反,创建异步任务的承诺,然后在需要时等待它。这样,您就可以将异步执行限制在实际需要它的代码块上


这些罕见的病例是:

1) 加载一些全局配置,您必须访问代码中的任何地方,因此,如果配置未准备好,则启动服务没有任何意义

2)
waiting
ing在您服务的顶级文件中:由于没有模块依赖于它,这不会导致任何问题



旁注:顶级wait尚未指定,NodeJS支持也尚未指定。要在生产中使用它,您必须等待几个月(?)。

目前还不是,它仍然是一个问题,我建议您阅读以下内容:。如果它从未更改,为什么需要存储在数据库中?只要把它放在一个配置文件中,并导入到你的模块中。是的,但我可以(并且想要)通过GUI(我的应用程序)简单地更改设置。将
var-okta_-api_-key
设置为一个承诺,您可以在不反复执行异步任务的情况下等待任意多次。因此,只需说const-okta_-api_-key=doSomethingAsync(),然后在函数中说const-real_-api_-key=wait-okta_-api_-key()?谢谢,它看起来确实有效(您的示例),但它返回了一个承诺。我只想要那根绳子。所以,承诺正确解决了,但是okta_api_密钥不包含正确的值。顺便问一下,您将如何处理此问题?是的<代码>等待这个承诺,一切都很好。这在TL?var okta_api_key=(async()=>{return await process.env.okta_api_key;})上是不可能的;不起作用,因为在okta_api_密钥中有承诺
 var okta_api_key = (async () => {
    return  await <getting key async>
 })();