【发布时间】: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