2017-10-09 1 views
2

J'ai le problème qu'au moins l'une des fonctions then() n'attend pas celle avant de se terminer.Ajouter les résultats de la deuxième requête pour répondre à la première requête

Le code est raccourci mais à peu près comme ceci:.

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

Si j'imprimer le objCheck à la console à la fin, je vois que les mesures sont remplies Mais en ajax() appeler est pas envoyé le long. Donc il me semble que la dernière fois() court avant la fin de la deuxième.

Cela ressemble à un malentendu de mon côté. Quelqu'un peut-il me dire ce qui ne va pas dans ma logique?

+0

[S'il vous plaît ne pas mettre des balises dans les titres de question] (https: // stackoverflow.com/help/tagging) – Liam

+0

@Liam Merci. Je ne savais pas à ce sujet. Je pensais que parce que ma question est spécifique à une bibliothèque, il serait logique de l'affiner dans le titre. –

Répondre

1

Vous devez retourner quelque chose (promesse ou juste objet, tableau, ...) dans le rappel de chaque alors:

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

Je vois maintenant que j'ai besoin d'en apprendre beaucoup plus sur Promises. Il y a un bug dans votre code. Dans la ligne "chekpoint.measures = res [i];" l'élément res [i] est un objet Promise et non les données dont j'ai besoin. J'essaie de résoudre ce problème maintenant. Merci jusqu'à présent. –