2016-08-09 5 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){ 

}); 

내 말은 스택 내 몽구스 노선의 일부를 기반으로 응용 프로그램을 가지고있다. 나는 몽구스 루트의 콜백에서 벗어나 약속을 사용하여 처리하도록한다. 그러나 나는 그것을 정확하게하는 방법을 알아낼 수 없습니다. 예를 들어

: 당신은 코드를 읽고 유지하기 어려워을 받고 있음을 알 수 위의 예에서

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 
      } 
     }) 
    } 
    }) 
}); 

. 내 코드를 개선하기 위해 여기서 Promises를 어떻게 사용할 수 있습니까?

답변

3

좋아, 우선 mongoose을 사용하고 있습니까?

User 다음 방법 중 하나를 호출 한 후 방법 등 findOne(query), findOneAndUpdate(query, update, opts) 등에 응답하여 몽구스 모델 ..

하고, 쿼리를 반환하는 방법 exec()를 호출합니다.

쿼리가 정확히 약속이 아니므로 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 약속 라이브러리를 몽구스로 연결하고 있습니까? 그리고'then' 함수는'_findUser' 약속이 반환 될 때 실행됩니까? 그리고'약속을 되풀이하다 '는 말은'_findUser' 함수가'resolve'또는'rejected'인지 여부를 추측합니다. 내가 맞습니까? – Skywalker

+0

정확하게,'mongoose.Promise = Promise'는 몽구스에게 네이티브 ES6 약속을 사용한다고 말하고 있습니다. 연쇄 약속 :'_findUser()'는 예상되는 사용자를 언젠가 돌려주는 무거운 작업입니다 ** ** 사용자가'user'를 해결했을 때 새로운 작업을 시작할 수 있습니다 (반환을 알아 봤습니까?)'_findReceipt() '. 그것은 또한 '영수증'을 반환 할 무거운 작업입니다. ** ** 당신이 '영수증'을 해결하면 귀하의 응답을 되돌릴 준비가 된 것입니다. ** 태스크 **가 에러를 발생 시키면,'catch' 문을 실행합니다. – Manu

+0

설명해 주셔서 대단히 감사드립니다. 나는 대부분 그것을 지금 이해합니다. 웬일인지 나는 내 머리를 감싸기가 꽤 어렵다는 것을 알고있다. – Skywalker