【问题标题】:Is there any C# GetAwaiter equivalent in NodeJSNodeJS 中是否有任何 C# GetAwaiter 等价物
【发布时间】:2018-07-06 13:54:00
【问题描述】:

我有这个代码:

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 让它等待承诺完成,在 NodeJS 中是否有任何等价物?或者在这种情况下有没有其他选择?谢谢。

【问题讨论】:

  • (async () => {var myData = await test();})();。也就是说,IIFE。仅供参考,C# 现在支持 async Mains :)
  • 我不完全明白你为什么需要 GetAwaiter 来等待任务完成 - 你可以对 Task 对象做同样的事情(比如 .Result 或 await)。
  • @Yevgeniy.Chernobrivets .GetAwaiter().GetResult().Result 更推荐,如果你不能 await。 IIRC 它与异常传播有关。但是有了写async Task Main(string[] args) 的能力,这些天就不需要太多了。
  • @Yevgeniy.Chernobrivets 不使用 GetAwaiter,您将需要更多缩进或创建一个新函数,这会使代码更难阅读并且看起来很混乱

标签: c# node.js async-await


【解决方案1】:

不!所有async 函数都返回promises,您需要从另一个async 函数内部await 它们,或者then 它们:

所以你可以:

(async () => {
    var myData = await test();
})();

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

换句话说,Node 中无法将 async 函数转换为 sync 函数。 一直是异步的,顺便说一下,这也是 C# 中推荐的方法。


注意当你在 Promise 上使用 await 时,抛出异常,所以你需要在 try/catch 块中包含你的 await 语句。但是,在使用 .then() 时,您还需要指定 .catch() 方法来处理错误。

【讨论】:

  • 啊伙计!我知道这个,我希望这不是会出现的答案,但我很期待这个会出现。好的,到目前为止,我认为这是唯一可行的方法
  • 我听到了!我也来自 C# 背景,有时能够在异步操作上同步 wait 很方便。但是在 Node 中,没有办法绕过它(可能是有充分理由的)。我的建议是采用异步和承诺方法。你很快就会习惯的。祝你好运:)
  • 我明白了你的意思,我正打算做你所描述的那个,但我仍然在寻找一种可能的方法来像 C# 一样
  • 我真诚地建议不要阻塞异步操作,因为这会降低您的应用程序性能,并且肯定会破坏异步操作的适当模式和用法。使用async/await 关键字,您可以轻松整洁地执行异步操作并维护线性代码。但是,如果您真的在寻找一种将异步操作转换为同步的方法(同样,如果可能,不要这样做)在此处寻找方法/hack:stackoverflow.com/questions/21819858/…
猜你喜欢
  • 2011-06-13
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多