2017-11-29 25 views
0

こんにちは私は約束を返す非同期関数makeRemoteExecutableSchemaを呼び出そうとしています。UnhandledPromiseRejectionWarning:Node.JSの未処理の約束拒否(拒絶ID:1)

async function run() { 
    const schema = await makeRemoteExecutableSchema(
    createApolloFetch({ 
     uri: "https://5rrx10z19.lp.gql.zone/graphql" 
    }) 
); 
} 

私はこの関数をコンストラクタで呼び出しています。

class HelloWorld { 
    constructor() { 
     try { 
     run(); 
     } catch (e) { 
     console.log(e, e.message, e.stack); 
     } 
    } 
} 

このエラーが発生します。誰もこれを解決する方法を知っていますか?

(node:19168) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property 'getQueryType' of undefined 
(node:19168) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. 
+0

ちょうど注記:一般的に、コンストラクタは非同期であってはいけません。また、そのような副作用があります。https://stackoverflow.com/a/24686979/1531054 –

答えて

2

makeRemoteExecutableScheme()は、最終的に拒否した約束を返す場合は、その拒絶反応を処理するコードを全く持っていません。次の2つの方法のいずれかにそれを扱うことができます。

async function run() { 
    try { 
     const schema = await makeRemoteExecutableSchema(
     createApolloFetch({ 
      uri: "https://5rrx10z19.lp.gql.zone/graphql" 
     }) 
    ); 
    } catch(e) { 
     // handle the rejection here 
    } 
} 

それともここに:

class HelloWorld { 
    constructor() { 
     run().catch(err => { 
      // handle rejection here 
     }); 
    } 
} 

あなたがawait周りと同じ関数内try/catchを使用しています。 1つのrun()が返されました。その時点で約束をしているだけなので、拒否を.catch()で受け取ります。try/catchではありません。


それはawaitは、関数内でのみ.then()ための構文糖であることを覚えておくことが重要です。それはその機能を超えた魔法を適用しません。 run()が返されると、それはただの約束を返しているので、返された約束からの拒否を捕まえたい場合は、.catch()を使用するか、awaitを再度使用してからtry/catchで囲む必要があります。 try/catchと待望の約束を取り囲むことは、あなたがやっていたことである拒否された約束を捕まえることはありません。

関連する問題