Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么要等待外部异步函数工作?_Javascript_Node.js_Mongodb_Asynchronous - Fatal编程技术网

Javascript 为什么要等待外部异步函数工作?

Javascript 为什么要等待外部异步函数工作?,javascript,node.js,mongodb,asynchronous,Javascript,Node.js,Mongodb,Asynchronous,所以我一直在摆弄javascript,发现了一个奇怪的行为,至少现在是这样 鉴于这些片段 database.js 从“MongoDB”导入MongoDB; const MongoClient=MongoDB.MongoClient; 常量uri=”mongodb://127.0.0.1:27017/?poolSize=20&writeConcern=majority" const mongoClient=new mongoClient(uri,{useUnifiedTopology:true})

所以我一直在摆弄
javascript
,发现了一个奇怪的行为,至少现在是这样

鉴于这些片段

database.js
从“MongoDB”导入MongoDB;
const MongoClient=MongoDB.MongoClient;
常量uri=”mongodb://127.0.0.1:27017/?poolSize=20&writeConcern=majority"
const mongoClient=new mongoClient(uri,{useUnifiedTopology:true});
举个例子;
const getInstance=async()=>{
如果(!实例){
instance=mongoClient.connect();
}
返回实例;
}
export const client=wait getInstance();
services.js
从“/database”导入{client}
//返回项目数组
函数getUserRecommendationItems(用户名){
const shopifyDb=client.db('Shopify');
const product=shoppifydb.collection(“产品”);
返回产品.find().toArray();
}
导出默认值{getUserRecommendationItems}
index.js
从“/services”导入服务
(异步()=>{
const products=await services.getUserRecommendationItems();
控制台日志(产品);
})();
当我在
database.js
中删除wait时,它会抛出一个错误,因为它需要等待客户端首先连接

我的问题是,为什么我可以在
service.js
中访问
client
,而不把它放在异步函数中?
这是否意味着导出和导入是隐藏的异步功能?

似乎是您的环境支持的。该提案目前处于第4阶段,即“完成”,可正式纳入规范。但支持率可能仍有所不同

:

顶层
wait
让我们依靠模块系统本身来处理所有这些承诺,并确保事情协调一致。上述示例可以简单地编写和使用,如下所示:

//waiting.mjs
从“/some module.mjs”导入{process}”;
常量动态=导入(computedModuleSpecifier);
const data=fetch(url);
export const output=进程((等待动态)。默认值,等待数据);
//usage.mjs
从“/waiting.mjs”导入{output};
导出函数outputPlusValue(value){返回输出+值}
console.log(outputPlusValue(100));
setTimeout(()=>console.log(outputPlusValue(100),1000);
waiting.mjs
中的
waiting
s承诺得到解决之前,
usage.mjs
中的任何语句都不会执行,因此比赛条件是通过设计避免的。这是一个扩展,如果
waiting.mjs
没有使用顶级
wait
,那么
usage.mjs
中的任何语句都不会执行将一直执行,直到加载
waiting.mjs
并执行其所有语句为止


因为您在
database.js
中有一个顶级
wait
,所以
services.js
只有在该模块的
client
承诺得到解决后才会执行。

据我所知,您已经在导出已履行的承诺(client)从你的database.js中。因此,当你在service.js中访问客户端时,你正在使用该对象。另外,你在问题中添加index.js的原因是什么?它不在描述中。@TusharShahi感谢你的回答,我添加index.js只是为了让我的问题充满上下文,但这仍然保留了主要问题。我试图移动他在getInstance函数中等待,而我得到的
client.db不是一个函数
错误。这同样非常奇怪,因为
mongoClient.connect()
是一个承诺,它应该已经起作用了。“我得到的client.db不是一个函数错误。这同样非常奇怪”-异步函数返回一个承诺-当您在
getInstance
函数之前删除
Wait
时,您正在导出处于挂起状态的承诺。您需要
Wait
客户机或链接一个
客户机,然后
方法调用以使用实现它的值。在挂起的promi上调用
db
方法se是错误的原因。啊,我现在明白了,javascript文档T确实提到了它
,但是它可以单独用于javascript模块。
,其中包括顶级await。谢谢。