[英]Why does this await outside async function work?
所以我一直在摆弄javascript
并发现了一个奇怪的行为,无论如何现在。
鉴于这些片段
database.js
import MongoDB from "mongodb";
const MongoClient = MongoDB.MongoClient;
const uri = "mongodb://127.0.0.1:27017/?poolSize=20&writeConcern=majority"
const mongoClient = new MongoClient(uri, { useUnifiedTopology: true });
let instance;
const getInstance = async () => {
if (!instance) {
instance = mongoClient.connect();
}
return instance;
}
export const client = await getInstance();
services.js
import { client } from "./database"
//return array of items
function getUserRecommendationItems(username) {
const shopifyDb = client.db('Shopify');
const product = shopifyDb.collection('product');
return product.find().toArray();
}
export default { getUserRecommendationItems }
index.js
import services from "./services"
(async () => {
const products = await services.getUserRecommendationItems();
console.log(products);
})();
当我在database.js
中删除 await 时,它会引发错误,因为它需要等待客户端首先连接。
我的问题是,为什么我可以在service.js
中访问client
而不将其放入异步 function 中? 这是否意味着导出和导入是底层的异步函数?
似乎您的环境支持顶级 await 提案。 该提案目前处于第 4 阶段,这意味着“完成”并且可以正式包含在规范中。 但支持可能仍会有所不同。
引用提案:
顶级
await
让我们依靠模块系统本身来处理所有这些承诺,并确保事情得到很好的协调。 上面的例子可以简单地编写和使用如下:// awaiting.mjs import { process } from "./some-module.mjs"; const dynamic = import(computedModuleSpecifier); const data = fetch(url); export const output = process((await dynamic).default, await data);
// usage.mjs import { output } from "./awaiting.mjs"; export function outputPlusValue(value) { return output + value } console.log(outputPlusValue(100)); setTimeout(() => console.log(outputPlusValue(100), 1000);
在
awaiting.mjs
中的await
解决了它们的 Promise 之前,usage.mjs
中的所有语句都不会执行,因此设计上避免了竞争条件。 这是一个扩展,如果awaiting.mjs
没有使用顶级await
,则在awaiting.mjs
加载并且所有语句都已执行之前,usage.mjs
中的所有语句都不会执行。
因为您在database.js
中有一个顶级await
,所以services.js
将仅在该模块已解决其client
promise 时执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.