2017-10-09 74 views
2

我有一個問題,即至少有一個then()函數沒有在等待結束之前的那個函數。從第二個查詢中添加結果以從第一個查詢中回答

代碼被縮短,但大致是這樣的:

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

如果我打印出來的objCheck在年底控制檯我看到措施填充但在阿賈克斯()調用它不是一起發送。所以它看起來像最後一個()在第二個最後一個完成之前運行。

這似乎是從我身邊的一個誤解。有人能告訴我我的邏輯有什麼問題嗎?

+0

[請不要把問題標題標籤(https://開頭stackoverflow.com/help/tagging) – Liam

+0

@Liam謝謝。我不知道這件事。我以爲因爲我的問題是特定於圖書館的,所以在標題中縮小它是有意義的。 –

回答

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

我現在看到我需要更多地瞭解Promise。代碼中存在一個錯誤。在「chekpoint.measures = res [i]」的行中元素res [i]是一個Promise對象,而不是我需要的數據。我試圖現在解決這個問題。謝謝你到目前爲止。 –

相關問題