2017-10-09 72 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对象,而不是我需要的数据。我试图现在解决这个问题。谢谢你到目前为止。 –

相关问题