2016-08-09 15 views
1

私はJavaScriptまたはatleastの約束を理解しています。マングースルートの約束を使用

は約束を作成します。

var promise = new Promise(function(resolve, reject){ 
    // do something async here 

    if(itWorked){ 

    resolve(); 

    }else { 

    reject(); 
    } 

}); 

プロミスを使用します。コールバック地獄になっている

promise.then(function(result){ 

},function(err){ 

}); 

私はMEANスタックと私のマングースルートの一部に基づいてアプリを持っています。私はモンゴーズルートのコールバックから離れ、Promisesを使って処理したい。しかし、私はそれをいかに正確に行うかを理解できないようです。

例:上記の例で

app.get('/users', function(req, res){ 

    User.findOne(_id, function(err, user){ 
     if(err) 
     console.log(err) 
     else if(user){ 

     Receipt.findOne(user.bookName, function(err, book){ 
      if(err) 
      console.log(err) 

      else if(book){ 
      // again do something here 
      } 
     }) 
    } 
    }) 
}); 

あなたは、コードの読み取りと保守が難しくなっていることがわかります。コードを改善するためにここで約束を使用するにはどうすればよいですか?

答えて

3

最初にmongooseを使用していますか?

Userは、クエリを返すメソッドexec()を呼び出して、これらのメソッドのいずれかを呼び出した後、このようなfindOne(query)findOneAndUpdate(query, update, opts)などなどのメソッドに応答あなたのマングースモデル..

です。

クエリーは必ずしもプロミスではなく、Mongoが使用する約束を指定する必要があります。ここで私はそうネイティブのものを使用することをお勧めします、あなたのプロジェクトでは、この行を追加します。今すぐ

const mongoose = require('mongoose') 
mongoose.Promise = Promise 

は、この命令はあなたに約束を返して、素敵!

User.findOne(q).exec() 

あなたは今、たとえば、あなたのロジックとの約束チェーンを作成することができます。

return User 
    .findOne(_id) 
    .exec() 
    .then((user) => { 
     return Receipt 
     .findOne({ bookName: user.bookName }) 
     .exec() 
     }) 
    .then((receipt) => { 
      // example 
      return res.status(200).json(receipt) 
     })) 
    }) 

ヒント:私は、コードをさらにきれいにするために補助メソッドを作成することをお勧めしたい:

/** @return {Promise} */ 
function findUser(id) { 
    return User.findOne(id).exec() 
} 

/** @return {Promise} */ 
function findReceipt(bookName) { 
    return Receipt.findOne({ bookName }).exec() 
} 

// example 
function f(req, res) { 
    const userId = req.get('id') 

    return findUser(userId) 
    .then((user) => findReceipt(user.bookName)) 
    .then((receipt) => res.status(200).json(receipt)) 
    .catch((err) => res.status(500).json(null)) 
} 

// register your handler 
app.get('/book', f) 
+0

ありがとうございました。いくつかの概念をクリアするための質問はほとんどありません。 'mongoose.Promise = Promise'行でネイティブES6の約束ライブラリをマングースに差し込んでいますか? 'thenf'関数は' _findUser'約束が返ったときに実行されますか?そして、「約束を返す」という言葉を推測しているのは、 '_findUser'関数が'解決済み 'か'拒否済み 'かを意味します。私はそうですか? – Skywalker

+0

正確には、 'mongoose.Promise = Promise'はネイティブのES6の約束を使うようモンゴースに伝えています。連鎖約束: '_findUser()'は予想されるユーザーをいつか戻す重い作業です** **あなたが 'user'を解決したときにあなたは新しい仕事を始めることができます(あなたは戻りますか?)' _findReceipt() '。それはまた、「領収書」を返す重い作業です。 **あなたが「領収書」を解決したとき、あなたはあなたの返答を返す準備ができています。これらのタスクのうち、** ANY **がエラーを起こした場合、あなたは 'catch'ステートメントを実行します – Manu

+0

ありがとうございます。私は今ほとんどそれを理解しています。なんらかの理由で私は頭がおかしいと約束しています。 – Skywalker