javascript - 如何使用脚本类型模块正确实现异步功能?
问题描述
在我的 html 文件中,我有一个模块类型的脚本标签,我通过 CDN 从 Firebase 导入函数。
一个这样的函数是一个称为 setDoc 的 await 函数。我需要在我编写的名为 save() 的函数中使用 setDoc,该函数由按钮触发。
我尝试过的:我得到的第一个错误是 save()“未在 HTMLButtonElement.onclick 中定义”
我将我的 save() 函数移动到一个单独的脚本标签(它不是模块类型)中,它现在可以工作并在单击按钮时触发。但是,即使我的 save() 以 async 为前缀,我也无法使用 await Firebase 函数,因为我需要在单独的脚本标记中再次导入 Firebase 函数。但是如果不将单独的脚本标签的类型设置为“模块”,我就无法导入 Firebase 函数。所以这对我来说是一个循环问题。
如何正确实施 await 方法 setDoc?
解决方案
您可以简单地导出保存方法并将其导入并保存在窗口中。由于模块中定义的任何内容对该模块都是私有的,因此需要在窗口上明确设置它。
https://codesandbox.io/s/stackoverflow-69083332-using-an-exported-function-as-an-event-handler-s9x9x
索引.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>Exported Function as an event</title>
<script type="module">
import { save } from "./module.js";
window.save = save;
</script>
</head>
<body>
<button onclick="save()">
Save
</button>
</body>
</html>
模块.js
export async function save() {
return new Promise((resolve) => {
setTimeout(() => {
alert("Saved");
resolve();
}, 1000);
});
}
推荐阅读
- ruby - 运行要求时“无法加载此类文件 - ruby-debug”表示什么?
- c# - ConnectSsl 方法抛出 System.IO.IOException。现有连接被远程主机强行关闭
- android - 将应用程序从 Google Play 移植到 Amazon FireHD
- java-me - 诺基亚 3310:MIDlet 总是给出“无法编译文件”
- apache-spark - 在 Spark DataFrame 中将列居中的简单方法
- angular - Agm 地图更改建筑物的级别/楼层
- c++ - 将 Visual C++ 代码转换为 Borland C++Builder
- java - Google Sheets API 排序范围
- python - 图像大小调整和空间改变之间的区别
- r - 根据 2 列中的值 + 模糊匹配对表进行重复数据删除