繁体   English   中英

为什么这在异步 function 之外等待工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM