繁体   English   中英

打字稿、承诺和异步等待混淆

[英]Typescript, promises, and async await confusion

我正在用 Typescript 编写代码,但在使用缺少同步函数/方法的库时遇到了麻烦。 我只需要等待一个承诺得到解决,我找不到这样做的合理方法。 我打算做的只是:

public someObjectMethod(): any {
    externalLibrary.doSomeghing()
    // wait for that something to happen
    // continue doing stuff

我知道我可以使方法async所以它返回一个Promise然后也声明调用方法async以便它也返回一个Promise等等,直到我最终达到可以await ,但如果我这样做了,我'最终会得到一个对象模型,其中每个方法都是async ,每个对象都是一个Promise 问题是我为此使用了 Typescript,希望能够编写 OO 代码而不是 Javascript 脚本。 我不认为使用Promisesasyncawait会在大型 OO 模型中扩展,我真的不需要我可以从异步调用中获得的额外性能,而是需要我可以从同步调用中获得的流量控制。

所以问题是......是否有一种 - 合理的 - 方法来等待Promises解决?

这不是一个重复的问题!

我在问在编写面向对象模型的上下文中是否有一种合理的方法来等待Promise解决。 将调用跟踪中的所有函数更改为async ,然后在各处处理Promises并不是解决此问题的合理方法。 我需要知道是否有一种方法可以在每次遇到没有同步实现的库时只等待Promise解决而不是更改一半代码的签名。

一旦你调用异步代码——无论是使用“回调地狱”、承诺、异步/等待(承诺周围的语法糖),甚至是 Monadic 的东西(这是一个肮脏的词吗?)——恐怕你会陷入困境异步代码。

如果您愿意,您可以在回调语法和 Promise 之间进行转换。

function foo(cb: (err: any, value: string) => void): void {
   doSomethingPromisey()
       .then(
           (value) => cb(null, value),
           cb
       );
}

foo((err: any, value: string) => {
    if (err) {
        // Do something with the error here.
        // Note that throwing an error will just cause a Promise rejection - once you're in a Promise chain, there's no escaping!
        throw new Error("It didn't work :(");
    } else {
        console.log(value);
    }
});

但这不是你想要的。

我认为您的选择是:

  • Fork 库以编写代码的同步版本。
  • 接受 Promises 进入你的生活和代码库。

根据我的经验,在 OO 代码中使用 promise 没有什么可担心的。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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