簡體   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