javascript - 编写异步函数的具体困惑。任何人都可以验证吗?
问题描述
我对 NodeJS 很陌生。我试图编写一个可以简单地从数据库返回配置值的函数。我可能需要多次调用它。
在 PHP 或其他同步语言中,我会使用以下代码
function getConfigValue($configKeyName)
{
// DB READ OPERATIONS
return $confguration_value_fetched_from_db
}
getConfigValue("key1");
getConfigValue("key2");
ETC
但是在 NodeJS 中,由于代码的异步特性,我发现执行此操作太难了。在这里问了一些问题,并花了几个小时学习回调、承诺、异步/等待关键字之后,作为初学者,下面是我能达到的最佳代码。
// Below function defines the 'get' function
var get = async (key) => {
var result = await COLLECTIONNAME.findOne({key}); //MongoDB in backend
return result.value;
}
// Here I am forced to define another async function so that I can await for the get function.
function async anotherfunction()
{
var value_I_am_lookingfor1 = await get("key1");
var value_I_am_lookingfor2 = await get("key2");
}
anotherfunction();
虽然它可能有效,但我对结果并不完全满意,主要是因为我真的不想根据这个函数 anotherfunction() 中获取的值进行所有进一步的编码。我想要的只是获取一个值?此外,我可能需要从应用程序中的许多地方轻松调用它,而不仅仅是从这里(我打算将它放在一个模块中)
有更好或更简单的方法吗?或者我应该总是得到我想要的值,然后用'then'嵌套它。做后续操作?我什至怀疑我对 NodeJS 编码本身采取的基本方法可能是错误的。
谁能指导我?
解决方案
主要是因为我真的不想根据这个函数 anotherfunction() 中获取的值进行所有进一步的编码。我想要的只是获取一个值?
因为请求是异步的,并且您的代码首先取决于获取的值,所以没有其他选择,只能等待检索到的值再继续。在脚本中的某处,控制流需要停止,直到在脚本的其他部分继续之前检索到值。
此外,我可能需要从应用程序中的许多地方轻松调用它,而不仅仅是从这里(我打算将它放在一个模块中)
您应该让该模块发出请求并导出解析为所需值的 Promise。而不是使用await
(强制以串行方式处理请求),您可能应该使用Promise.all
,这将允许一次发送多个请求。例如:
valuegetter.js
const get = key => COLLECTIONNAME.findOne({ key }).then(res => res.value);
export default Promise.all([
get('key1'),
get('key2')
]);
main.js
import prom from './valuegetter.js';
prom.then(([val1, val2]) => {
// do stuff with val1 and val2
})
.catch((err) => {
// handle errors
});
如果其他模块需要val1
and ,请使用它们需要的值val2
调用它们。main.js
推荐阅读
- matlab - win x64 上的 GStreamer“SimpleMovieDemo”错误
- django - Django - 通过字段过滤相关对象
- python - Django 向另一个 webapp 发出许多 post 请求总是被取消
- python - 如何处理在熊猫中合并大型 csv 文件?
- jquery - 在输入上启动时间选择器时更改事件触发
- c - 为什么我没有收到任何错误?在这几行之间--- typedef int floa[1]; 浮动 a[5]={5,6,1,2,6,8};
- button - 如何在 SwiftUI 中使按钮组的宽度相同
- iis - Windows Server 2016 中的错误水晶报告运行时
- youtube-dl - youtube-dl:通过忽略 archive.txt 中指定的视频,将 youtube 视频 info.json 下载到播放列表中
- python - 如何找到日期时间的平均时间?