Typescript,Promise和Async等待混淆

时间:2018-08-16 22:00:20

标签: javascript node.js typescript promise async-await

我正在用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解析,而不是每次遇到没有同步实现的库时都更改一半代码的签名。

1 个答案:

答案 0 :(得分:0)

一旦您调用异步代码-它是否使用“回调地狱”,Promise,async / await(Promises周围的语法糖)或什至是Monadic(这是一个肮脏的词吗?)-恐怕您是停留在异步代码中。

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

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);
    }
});

但这不是您想要的。

我认为您的选择如下:

  • 分叉库以编写代码的同步版本。
  • 接受承诺,成为您的生活和代码库。

根据我的经验,使用OO代码中的promise不必担心。 :)