关于编写异步函数的特定困惑。谁能验证?

时间:2018-09-13 06:41:16

标签: javascript node.js asynchronous mongoose async-await

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

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

function getConfigValue($configKeyName)
{

// DB READ OPERATIONS

return $confguration_value_fetched_from_db

}

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

但是在NodeJS中,由于代码的异步特性,我发现执行此操作太困难了。在这里问了一些问题,并花了几个小时学习回调,Promises,Async / await关键字之后,成为初学者,下面是我可以找到的最佳代码。

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

有人可以引导我吗?

1 个答案:

答案 0 :(得分:1)

  

主要是因为我真的不想基于此函数anotherfunction()中获取的值进行所有进一步的编码。我只想获取一个值?

因为请求是异步的,并且您的代码取决于首先获取的值,所以没有选择 other 的选择就是等待继续获取值。 脚本中的某个地方,控制流需要暂停,直到在脚本其他部分继续之前检索到值为止。

  

此外,我可能需要在应用程序中的许多地方轻松地调用它,而不仅仅是从这里开始(我打算将其放置在模块中)

您应该让该模块发出请求并导出一个Promise,该Promise可以解析为所需的值。您可能应该使用await,而不是使用Promise.all(这会强制请求在序列中被串行处理),而不是使用const get = key => COLLECTIONNAME.findOne({ key }).then(res => res.value); export default Promise.all([ get('key1'), get('key2') ]); ,这将允许一次发送多个请求。例如:

valuegetter.js

import prom from './valuegetter.js';
prom.then(([val1, val2]) => {
  // do stuff with val1 and val2
})
.catch((err) => {
  // handle errors
});

main.js

val1

如果其他模块需要val2main.js,请从props.setProperty(ProducerConfig.RECONNECT_BACKOFF_MS_CONFIG, "10000"); 调用它们所需的值。