2017-09-27 30 views
5

私はNode.jsの非同期/待機機能でMongooseの約束を使用してハングアップしようとしています。私の関数printEmployeesが呼び出されたとき、私はorderEmployees関数によって照会された従業員のリストを保存したいと思います。 console.logステートメントの内部にorderEmployeesが返され、printEmployeesconsole.logundefinedを返し、私が約束を正しく返さないことを示しています。async/awaitでmongoose約束を使用する

私は、パラダイムを正しく理解していないということを完全に可能にすることを約束しています...どんな助けでも大歓迎です。

printEmployees: async(company) => { 
    var employees = await self.orderEmployees(company); 
    // SECOND CONSOLE.LOG 
    console.log(employees); 
    }, 

    orderEmployees: (companyID) => { 
    User.find({company:companyID}) 
    .exec() 
    .then((employees) => { 
     // FIRST CONSOLE.LOG 
     console.log(employees); 
     return employees; 
    }) 
    .catch((err) => { 
     return 'error occured'; 
    }); 
    }, 

答えて

3

あなたはそうあなたがawait、本質的には何も/ undefinedを返さない関数にINGのしている、あなたのPromisereturnする必要があります。

あなたはあなたが戻る前に、いくつかのエラー処理や前処理を行いたい場合であるとして、あなたはあなたのコードを維持することができますが、ただ戻してください orderEmployees

orderEmployees: companyId => User.find({ companyId }).exec() 

からPromiseを返す必要が

orderEmployees: (companyID) => { 
    return User.find({ company:companyID }).exec() 
} 
2

結果(約束は連鎖可能です)。

+0

私は[明示的な約束の作成の反パターン]を見ていません(https://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-iavoid -it)は、エラー処理に役立ちます。そのメリットは何ですか?シンプルな非同期関数から「従業員を返す」と「投げる」ことができます。 –

+0

@TamasHegedusええ、良い点、古い習慣は、Nodeが内部の約束から例外をうまくスローするのを手がけていなかったからです! – James

4

あなたはorderEmployeesからPromiseを返していません。

6

orderEmployeesを非同期関数のように動作させるには、結果として得られる約束を返さなければなりません。

  1. あなたは(非同期関数によって返さたとえば)あなたはどちらか.thenを呼び出す必要があり約束を持っている場合、それはPromise
  2. を返す場合、関数は非同期です:約束を使用した場合async/awaitキーワードを指定せずに従ってくださいするには、2つのルールがあります。それを返すか、それを返す。

あなたは、あなたが約束のawaitは、あなたが取得する必要がありますasync/awaitを使用しています。

これは、あなたがorderEmployeesの内部で生成された約束を返さないことに気づくでしょう。修正するのは簡単ですが、その関数を非同期に書き直すことも簡単です。

orderEmployees: (companyID) => { 
    return User.find({company:companyID}) // Notice the return here 
    .exec() 
    .then((employees) => { 
    // FIRST CONSOLE.LOG 
    console.log(employees); 
    return employees; 
    }) 
    .catch((err) => { 
    return 'error occured'; 
    }); 
}, 

または

orderEmployees: async(companyID) => { 
    try { 
    const employees = await User.find({company:companyID}).exec(); 
    console.log(employees); 
    return employees; 
    } catch (err) { 
    return 'error occured'; 
    } 
}, 

PS:エラー処理は、ここでやや欠陥があります。私たちは通常、関数からエラー文字列を返すことによってエラーを処理しません。この場合、エラーを伝播させて、トップレベルのUIコードから処理する方がよいでしょう。