2016-12-13 2 views
4

"then"メソッドを持つクラスを作成しました。このクラスはPromise型とは無関係です。 "then"メソッドは異なる目的を持ち、約束を返さない。私は、このクラスのインスタンスを待って返すTypescript 2.1.4でasync/await関数を書こうとしていますが、VSコードのTypescriptサーバーがエラーを出しています。メソッドの名前を "then"以外に変更すると、エラーはなくなります。エラーのあるasync/"then"と呼ばれるクラスメソッドで待機します

コード例:独自の「その後」メソッドを持つオブジェクトとの約束を使用して、なぜ

class MyClass { 
    then(): number { 
     // this method isn't related to Promise.then 
     return 2 + 2; 
    } 
} 

// three errors below go away when "then" is renamed 

// [ts] An async function or method must have a valid awaitable return type. 
async function my_async(): Promise<MyClass> { 
    let a: Promise<MyClass> = Promise.resolve(new MyClass()); 

    // [ts] Operand for 'await' does not have a valid callable 'then' member. 
    let b: MyClass = await a; 

    // [ts] Return expression in async function does not have a valid callable 'then' member. 
    return b; 
} 

誰かが説明できますが許可、または回避されていませんか?

+0

あなたはエラーが何であるかは言いませんでした。それはむしろ重要です。 – Carcigenicate

+0

@Carcigenicateありがとう、私の悪い! – drdrez

+0

コードも記入してください。エラーはあなたの戻り値の型に関係しているようです。 – Carcigenicate

答えて

3

あなたthen方法プロミスのAPIに関連です - あなたの約束を持つオブジェクトに解決された場合、ビューのJavaScriptのダック・タイピング・ポイントから、あなたのクラスは、特に、thenablethe specを参照してくださいthis step

... 
Let then be Get(resolution, "then"). 
... 

ですthen関数の場合、特別な意味を持ちます。thenableです。 then関数を持つ結果オブジェクトを生成することはできません。また、Promise解決アルゴリズムによって処理されない結果オブジェクトを生成することはできません。

3

約束は、.thenというメソッドを持つオブジェクトとして定義されます。たとえば、「require('bluebird/promise')によって返されたモジュール」として定義されていません。

約束のライブラリが約束を解決している場合、その結果が約束であれば、それは.thenへの呼び出しの中で最終的な結果を提示することではないということの一部です。例えば:

function myFn() { 
    // doPromise1 will eventually give us `1`. 
    return doPromise1().then(x => { 
    // doPromise2 will eventually give us `2`. 
    return doPromise2(); 
    }); 
} 

この関数を呼び出すと、その結果に.thenを呼び出すことは、私はdoPromise2()の内側になった約束を返しません。それは2を返すので、両方の約束が終わるまで待って、その最終的な値を与えます。

3thenの中に返した場合とは異なります。結果は約束ではなく、それを最終的な価値として提示します。しかし、問題の要点は、それがそれが約束ではないことをどのように知っているかということです。 if p instanceof Promiseのような型チェックは行いません。なぜなら、さまざまなライブラリには、Promiseの定義とポリフィルが多すぎるからです。代わりに、次のような一般的なものをチェックします:if (typeof p.then === 'function')

このチェックでクラスにtrueが返されます。これにより、あなたの値はPromise自体と考えるようになります。それはそれを実行し、別の約束のオブジェクトを取り戻すことを望んでいるが、数値を取得して失敗する。

関連する問題