在NodeJS中是否有与C# GetAwaiter相当的东西?

4

I have this code:

async function test() {
    var mongo = await MongoClient.connect(connectionString);
    var db = await mongo.db(databaseName);
    var audit = db.collection(collectionName);
    var result = await audit.find({}).toArray();
    return arrayData;
}

var myData = test();

但是显然myData仍然是promise对象。在C#中,我知道有一个函数GetAwaiter可以使其等待promise完成,那么在NodeJS中有没有相应的东西呢?或者有没有其他的替代方法?谢谢。


1
(async()= > {var myData = await test();})();。也就是说,IIFE。FYI,C#现在支持“async”“Main” :) - Aluan Haddad
我并不完全理解为什么需要使用GetAwaiter来等待任务完成 - 你可以通过Task对象完成相同的操作(例如.Result或await)。 - Yevgeniy.Chernobrivets
建议在无法使用await的情况下,使用.GetAwaiter().GetResult()而不是.Result。如果我没记错的话,这与异常传播有关。但是,随着能够编写async Task Main(string[] args)的能力,这种方式在现今已经不再需要了。 - Aluan Haddad
@Yevgeniy.Chernobrivets 如果不使用GetAwaiter,你需要增加更多的缩进或创建一个新的函数,这会使代码更难以阅读并且看起来很混乱。 - Hans Yulian
1个回答

2
不对!所有的 async 函数都会返回 Promise,你需要在另一个 async 函数内部使用 await 或者使用 then 来处理它们:
所以你可以选择:
(async () => {
    var myData = await test();
})();

或者
test().then(data => {
    var myData = data;
});

换句话说,在Node中没有办法将一个async函数转换成一个sync函数。这是完全异步的,顺便说一下,在C#中也推荐使用这种方法。
注意:当你在一个promise上使用await时,异常会被抛出,所以你需要将await语句包含在try/catch块中。然而,当使用.then()时,你需要指定一个.catch()方法来处理错误。

啊,我知道这个问题,希望不是这个答案,但我相当期待这个答案。目前为止,我认为这是唯一可行的方法。 - Hans Yulian
1
我明白你的意思!我也来自C#背景,有时候同步等待异步操作是很方便的。但在Node中,这是无法避免的(也许是有充分的理由)。我的建议是接受异步和Promise的方法。你很快就会习惯的。祝你好运 :) - Arash Motamedi
我明白你的意思,我正要做你所描述的那个,但我仍在寻找一种可能的方法,就像C#一样。 - Hans Yulian
我真诚地建议不要在异步操作上阻塞,因为这可能会降低应用程序的性能,并且肯定会破坏异步操作的适当模式和使用。使用 async/await 关键字,您可以轻松而整洁地执行异步操作并保持线性代码。但是,如果您真的正在寻找一种将异步操作转换为同步操作的方法(如果可能的话,请不要这样做),请查看此处的方法/技巧:https://dev59.com/52Eh5IYBdhLWcg3w9nhj - Arash Motamedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接