だから、私は次のコードを持っています:
function sortVitalsByDate(tx, results){
vitals_counter = 0;
showLoader();
if(results.rows.length > 0){
for (var i=0;i<results.rows.length;i++){
vitals_counter += 1;
var record_id = results.rows.item(i).id;
readData('clinicalObservation', record_id, populateVitalsDateList);//calls readData function, uses populateVitalsDateList as the success callback (below)
//hideVitalsLoader();
}
console.log("< === sqlHostingArray == "+ sqlHostingArray); //sqlHostingArray is blank
}else{
$("#vitals-measures-content").html('<div class="no-info">No Information Entered</div>');
hideVitalsLoader();
}
console.log(arguments.callee.name + ", # rows: " + results.rows.length);
}
function populateVitalsDateList(tx, results){
var listItems = "";
for (var i=0;i<results.rows.length;i++){
var data_element = results.rows.item(i).data_element;
var heading;
var label;
var listItem;
var value;
var bpsVal;
switch(data_element){
case 'clinicalObservationDate':
label = null;
value = null;
listItem = null;
var dateObj = new Date(parseInt(results.rows.item(i).field_value,10));
//console.log("< == dateObj is " + results.rows.item(i).field_value);
//heading = formatDate(dateObj);
// v1.1.1 CRM date sorage callback
storeDateTemporarily(dateObj);
heading = decrypt(results.rows.item(i).field_label);
sqlHostingArray.push(heading);
break;
case 'bloodPressureSystolic':
label = "Blood Pressure";
value = decrypt(results.rows.item(i).field_value);
bpsVal = value;
break;
case 'bloodPressureDiastolic':
label = "Blood Pressure";
value = decrypt(results.rows.item(i).field_value);
if (value != "" && value != null && value != undefined){
listItem = addDateLI(results.rows.item(i).record_id, label, bpsVal + "/" + value);
}else{
listItem = "";
}
break;
case 'pulse':
label = "Pulse";
value = decrypt(results.rows.item(i).field_value);
if (value != "" && value != null && value != undefined){
listItem = addDateLI(results.rows.item(i).record_id, label, value + " bpm");
}else{
listItem = "";
}
break;
case 'respRateValue':
label = "Respiratory Rate";
value = decrypt(results.rows.item(i).field_value);
if (value != "" && value != null && value != undefined){
listItem = addDateLI(results.rows.item(i).record_id, label, value + " bpm");
}else{
listItem = "";
}
break;
case 'heightValue1':
label = "Height";
value = decrypt(results.rows.item(i).field_value);
if (value != "" && value != null && value != undefined){
listItem = addDateLI(results.rows.item(i).record_id, label, value + " cm");
}else{
listItem = "";
}
break;
case 'weightValue':
label = "Weight";
value = decrypt(results.rows.item(i).field_value);
if (value != "" && value != null && value != undefined){
listItem = addDateLI(results.rows.item(i).record_id, label, value + " kg");
}else{
listItem = "";
}
break;
case 'bmi':
label = "BMI";
value = decrypt(results.rows.item(i).field_value);
if (value != "" && value != null && value != undefined){
listItem = addDateLI(results.rows.item(i).record_id, label, value);
}else{
listItem = "";
}
break;
case 'tempBody':
label = "Temperature";
value = decrypt(results.rows.item(i).field_value);
if (value != "" && value != null && value != undefined){
listItem = addDateLI(results.rows.item(i).record_id, label, value + " °C");
}else{
listItem = "";
}
break;
default:
label = null;
listItem = null;
break;
}
if (label != null && label != "" && label != undefined && listItem != null && listItem != "" && listItem != undefined){
listItems += listItem;
}
//console.log(arguments.callee.name + ", label: " + label + ", listItem: " + listItem + ", data_element: " + data_element);
vitals_counter -= 1;
hideVitalsLoader();
}
}
これはすべて完全に正常に機能しますが、その行console.log("< === sqlHostingArray == " + sqlHostingArray);
が、そのすぐ上の for ループが完了する前に console.log が呼び出されていることを示していることを除きます。つまり、プッシュされる変数は、sqlHostingArray
後で実行する必要がありますが、使用する必要がある時点で定義されていません。変数がループ内で呼び出された場合は正常に機能しますが、ループが終了した後に実行する必要があります。誰かがそれを修正する方法を知っていますか?
編集
わかりましたので、非同期で実行します.... for ループの後に実行する必要がある部分を保持して、ループが終了するまで待機するにはどうすればよいですか。