javascript - 异步函数完成后我可以返回同步代码吗?
问题描述
一个异步函数的例子:
async function getJSONA(callback){
let json = await request.get(url, (req, res, html) => {
callback = html
});
return callback;
}
getJSONAsync().then((res) => {
fs.writeFileSync(`page.html`, res)
console.log(1)
})
效果很好,最后你得到“1”。现在,假设在.then
函数之后我想写一个console.log,像这样
getJSONAsync().then((res) => {
fs.writeFileSync(`page.html`, res)
console.log(1)
})
console.log(2)
显然,2 将比 1 更早记录。是的,我可以进一步编写异步构造来继续流程。但这会使代码复杂化并使其可读性降低,至少对我来说是这样。那么有没有办法在执行异步部分之后恢复正常的同步代码,就像我上面提到的那样?
解决方案
为了完成您正在寻找的排序,您将需要使用额外的异步构造。这些可能会变得非常复杂,但您有几个选择:
链承诺:
您正在等待
Promise
返回的 by以在通过调用方法getJSONAsync
打印之前解析,该方法还返回另一个可用于进一步排序的方法。看起来像这样:1
Promise#then
Promise
getJSONAsync().then((res) => { fs.writeFileSync(`page.html`, res) console.log(1) }).then(() => { console.log(2) })
async
用另一个函数包装:或者,您可以使用异步函数包装整个事物。如果你已经在一个异步函数中,你不需要做任何包装,但是为了使用
await
你需要引入另一个异步函数,然后你可以调用它。async function getAndWriteJSON() { const res = await getJSONAsync(); fs.writeFileSync(`page.html`, res) console.log(1); console.log(2); } getAndWriteJSON();
推荐阅读
- c - 如何限制用户输入任何 4 位组合,包括以 0 开头的组合并排除 C 中的所有其他字符?
- ruby-on-rails - 通过链接验证匿名用户访问
- python - 从 df 中按类别抽取随机子样本
- javascript - 打包时Webpack忽略数组变量
- javascript - 如何(真正)防止移动设备上的捏缩放
- google-bigquery - 为什么 BigQuery 会扫描整个表,尽管它是按小时分区的?
- xcode - AddressSanitizer 在 MacOS Mojave 上使用 Chromium Embedded Framework 引发崩溃
- database - 从 json 中提取唯一值的 SQLite 查询
- python-3.x - 如何在 python 3 中使用列表理解同时接受来自用户的不同数据类型
- ruby - 我可以在 Ruby 方法中访问隐式 Proc 中定义的方法吗?