javascript - 编写异步函数时的具体困惑。有人可以验证吗?

标签 javascript node.js asynchronous mongoose async-await

我对 NodeJS 很陌生。我试图编写一个可以简单地从数据库返回配置值的函数。我可能需要多次调用它。

在 PHP 或其他同步语言中,我将使用以下代码

function getConfigValue($configKeyName)
{

// DB READ OPERATIONS

return $confguration_value_fetched_from_db

}

getConfigValue("key1");
getConfigValue("key2");

等等

但是在 NodeJS 中,由于代码的异步性质,我发现执行此操作太困难了。在这里问了一些问题,并花了几个小时学习回调、 promise 、异步/等待关键字之后,作为初学者,下面是我能达到的最佳代码。

    // 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 编码本身采取的基本方法可能是错误的。

有人可以指导我吗?

最佳答案

mainly because I really don't want to do all my further coding based on the fetched value within this function anotherfunction(). All I want is to fetch a single value?

由于请求是异步的,并且您的代码取决于首先获取的值,因此除了等待获取值后再继续操作之外,没有其他选择。在脚本中的某个地方,控制流需要暂停,直到在脚本的其他部分继续之前检索到值。

Also I might need to easily call it from many places within the application, not just from here (I was planning to place it in a module)

您应该让该模块发出请求并导出一个解析为所需值的 Promise。您可能应该使用 Promise.all,而不是使用 await(这强制串行处理请求),它允许多个请求立刻发出去。例如:

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
});

如果其他模块需要 val1val2,请从 main.js 调用它们并使用它们需要的值。

关于javascript - 编写异步函数时的具体困惑。有人可以验证吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52307957/

相关文章:

javascript - 解析html页面后触发点击事件

node.js - 如何使用 Express/Nodejs 缓存单个资源

javascript - Node.js:从不同文件发送 XML 响应

node.js - 使用 NodeJS 在 Twilio 中创建短信群发器

javascript - RequireJS 在 IE9 中不工作

swift - 如何在 Swift 中创建自定义完成 block

javascript - 使用 json_encode 输出换行符或新行?

javascript - 如何在第一次迭代时设置一个值然后从不在 Javascript 中更改它

javascript - jQuery 从 HTTP 请求中获取 JSON

validation - 一般 : asynchonious validation in angular2