【问题标题】:Can I await promise resolution (HTTP request) before exporting a variable in NodeJS module?在 NodeJS 模块中导出变量之前,我可以等待承诺解析(HTTP 请求)吗?
【发布时间】:2019-07-28 14:23:07
【问题描述】:

我需要在同步脚本中使用一个异步计算的值,但我无法使其异步。

如果我编写一个模块来发出 HTTP 请求并计算值,当我 require/import 时它会返回一个 Promise:

// sync-script.js
const getCurrencyConversion = require('./get-currency-conversion')
getCurrencyConversion().then(result => console.log('Well too late now'))

我可以设计我的异步模块来等待 HTTP 响应并返回一个值而不是一个 Promise 吗?我应该吗?

我希望能够:

// sync-script.js
const getCurrencyConversion = require('./get-currency-conversion')
const myComputedValue = getCurrencyConversion(42)
// do sync stuff with it from here on out

在我的小脚本中阻止不会打扰我,在继续之前等待请求是有意义的。

但我想更好地了解如何处理此类情况。我目前的理解是,一旦你异步,你就永远不能“回去”。同步脚本需要支持异步,否则不起作用。

【问题讨论】:

  • 让整个脚本在 .then 中运行有什么问题 - 我的意思是,.then 中的所有内容都会“运行同步”
  • 我不能这样做,这是一个.scas.js 文件,只是module.exports = { // scas stuff }。要在转换输入的管道函数中使用myComputedValue,需要...在该点预先计算。
  • 不,您不能让export 等待异步操作完成。您可以做的最好的事情是导出一个promise,然后在要使用该值的脚本中对该promise 使用.then()。在 Javascript 中无法将异步值转换为同步值。做不到。
  • 我见过的唯一解决方法是在另一个 node.js 程序中获取异步值并使用 child_process sync 选项之一,如 child_process.spawnSync() 来运行该其他程序。这在技术上允许您以同步方式进行联网。显然不推荐用于服务器进程,但可以为您自己的单用户脚本完成。
  • 或者,您在启动时获取异步值,并且在您检索到异步值之前,您不知何故不会启动脚本的同步部分,因此同步部分可以运行(已经有可用的异步值)。您没有共享此同步部分的任何上下文,因此我们无法很好地帮助您处理它。

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


【解决方案1】:

Promise 返回 Promise 而不是 Value

此外,当您将 getCurrencyConversion 分配给 myComputedValue 时,您实际上分配了待处理的承诺,因为当您定义 myComputedValue 之类的变量时,它将立即分配,因此 Javascript 不会等待.这就是为什么 javascript 快

【讨论】:

    【解决方案2】:

    您可以使用 Promises 使您的代码异步 你应该把它包装成promise

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

    【讨论】:

    • 我认为您不需要将代码包装在一个承诺中......只需将脚本中的所有内容放在.then中即可
    • @JaromandaX 将同步脚本中的所有内容放在.then 中会很棒,但我不能这样做。我想知道我是否可以从我可以控制的导入模块端做一些事情。
    • @Leeroy - 如果您希望结果保持异步,则不是 - 再次,没有上下文,我不明白为什么您不能将所有内容都放入 .then
    【解决方案3】:

    在继续下一步之前,您可以创建一个异步函数并获取值。 欲了解更多信息,请通过此https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await 如果它是一个承诺,它将返回,否则返回值本身。

    const getCurrencyConversion = require('./get-currency-conversion')
    const myComputedValue = async()=> await getCurrencyConversion(42);
    console.log('value is',myComputedValue)

    【讨论】:

    • 不会 myComputedValue 只是一个 FUNCTION 吗? (提示:是的,它会的)
    猜你喜欢
    • 1970-01-01
    • 2017-10-24
    • 2020-01-15
    • 2021-11-26
    • 2017-11-24
    • 2017-07-30
    • 2023-02-17
    • 2018-12-14
    • 1970-01-01
    相关资源
    最近更新 更多