2017-12-25 17 views
0

내 약속에 문제가 있음, 삭제 된 상태를 확인하겠다고 약속 했으므로 상태가 삭제되면 약속이 거부되고 다른 경우는 해결되지만 q 응답을 거부 잡을 약속 내가 뭐가 잘못 아무 생각이 없다, 이것은 .findById 콜백이 완료되면 모든 기능은 즉시 실행, 내 코드는 코드를 작성했습니다 방식으로q.promise가 노드 js에서 거부 응답을 포착 할 수 없음

//Promises 

function checkDeleted(status){ 
    // 'status' return 0 or 1 
    var deleted = 1 
    var notDeleted = 0 

    return Q.promise(function (resolve, reject){ 
     console.log("check deleted executed") 
     if (status == notDeleted){ 
     console.log('Deleted Status: ' + status) 
     resolve(status) 
     } else { 
     console.log("Else executed") // if i try to update data that has been deleted, it will be executed, actually this already executed after i am try to update data 
     reject(new Error("Data has been deleted")) 
     } 
    }) 
} 

//Handler 
function updateTodo(req, res){ 
    Todo.findById(req.params.id, function (err, response){ 
     if (!err){ 
     checkDataValidated(response) 
     .then(checkDeleted(response.deleted)) //this should be return reject response 
     .then(dataUpdate(response, req)) 
     .then(saveDataUpdated(response)) 
     .then(function (data){ 
      res.json({"data":"all data already updated"}) 
     }) 
     .catch(function (error){ 
      res.send(error)// But reject response not catch here 
     }) 
     .done() 
     } 
    }) 
} 
+0

을 당신은'이를 다시 작성해야 그 때는 (() => checkDeleted (response.deleted)) 예를 들어. 그렇지 않으면'findById'에 대한 콜백이 실행되는 즉시 모든 함수를 호출하는 것입니다. –

답변

0

입니다. 이것을 () => checkDeleted(response.deleted)과 같은 클로저로 만들어야합니다.

나는 것 또한 추론하는 것이 더 쉽습니다 때문에 당신이 async/await를 사용하려면이 옵션을 다시 제안 :

async function updateTodo(req, res) { 
    const response = await Todo.findById(req.params.id); 
    try { 
    await checkDataValidated(response); 
    // This will throw an error if it rejects 
    await checkDeleted(response.deleted); 
    await dataUpdate(response, req); 
    const data = await saveDataUpdated(response); 
    res.json({"data":"all data already updated"}); 
    } catch (error) { 
    res.send(error); 
    } 
} 
+0

'.findById 콜백이 완료되면 모든 기능이 즉시 실행됩니다.' 사실 나는이 부분을 이해하지 못한다. 위의 모든 함수에서 모든 오류를 처리하라. checkDeleted 함수는 이미 거부 된 예외를 반환하지만 왜 잡을 수 없었는가? 모든 기능이 즉시 실행되면 즉시 문제가 발생하지 않습니까? –