2017-10-09 2 views
2

then() 함수 중 적어도 하나가 전에 끝내기를 기다리지 않고 있다는 문제가 있습니다.첫 번째 쿼리에서 대답하기 위해 두 번째 쿼리의 결과를 추가하십시오.

있지만, 대략 다음과 같은 코드가 단축된다.

내가 조치가 채워 것을 그러나 아약스에서 (참조 나는 끝에 콘솔에 objCheck을 인쇄 할 경우
 var objCheck = {}; 

    var id = thisClick.attr('id'); 
    APP.db.checkInfo.get(id).then(function (resultDetail) { 
     objCheck.details = resultDetail; 
    }).then(function() { 
     var checkPoints = APP.db.checkRooms.where('check_id').equals(id); 
     checkPoints.toArray(function(dataArray) { 
      dataArray.measures = []; 
      objCheck.checkpoints = dataArray; 
     }); 
    }).then(function() { 
     var arrayLength = objCheck.checkpoints.length; 

     for (var i = 0; i < arrayLength; i++) { 
      var roomId = objCheck.checkpoints[i].room_id; 
      var measure = APP.db.measures.where('room_id').equals(roomId); 
      measure.toArray(function(dataArray) { 
      objCheck.checkpoints[i].measures = dataArray; 
     }); 
     } 
    }).then(function() { 
     $.ajax(
     // Here I send then objCheck to the server 
     ).done(...); 
    }).catch(function(error) { 
    alert ("Error upload: " + error); 
    }); 

) 호출이 아닌 보냈다. 그래서 마지막 두 번째 것이 끝나기 전에 마지막으로 실행되는 것처럼 보입니다.

내 편이 오해 한 것 같습니다. 누군가 내 논리에서 잘못된 점을 말해 줄 수 있습니까?

+0

[질문 제목에 태그를 넣지 마십시오] (https : //로 stackoverflow.com/help/tagging) – Liam

+0

@ Liam Thanks. 나는 이것에 대해 몰랐다. 제 질문은 도서관에 한정되어 있기 때문에 제목에서 그것을 좁히는 것이 합리적이라고 생각했습니다. –

답변

1

당신은 뭔가 반환해야 (약속을하거나, ..., 배열 객체) 각의 콜백 :

var objCheck = {}; 

var id = thisClick.attr('id'); 

APP.db.checkInfo.get(id).then(function (resultDetail) { 
    objCheck.details = resultDetail; 
    return objCheck; 
}).then(function() { 
    var checkPoints = APP.db.checkRooms.where('check_id').equals(id); 
    return checkPoints.toArray(); 
}).then(function (dataArray) { 
    dataArray.measures = []; 
    objCheck.checkpoints = dataArray; 
    var arrayLength = objCheck.checkpoints.length; 

    var promises = objCheck.checkpoints.map(function(chk) { 
     var roomId = chk.room_id; 
     return APP.db.measures.where('room_id').equals(roomId); 
    }); 

    return Promise.all(promises); 
}).then(function(res) { 
    objCheck.checkpoints.forEach(function(chekpoint, i) { 
     chekpoint.measures = res[i]; 
    }); 
    return objCheck 
}).then(function() { 
    $.ajax(
     // Here I send then objCheck to the server 
    ).done(...); 
}).catch(function(error) { 
    alert ("Error upload: " + error); 
}); 
+0

약속을 더 많이 배울 필요가 있음을 알았습니다. 코드에 버그가 있습니다. "chekpoint.measures = res [i];"줄에 요소 res [i]는 Promise 객체이며 필요한 데이터는 아닙니다. 나는 이것을 지금 해결하려고 노력한다. 지금까지 고마워. –

관련 문제