我是相當新的承諾,並認爲我有處理事情,但顯然我沒有。Promise Chain Breaks w/.all()
以下代碼旨在獲取X個表名(getTableName()),將它們傳遞給getData()並循環遍歷每個表以獲取數據。然後,我調用Promise.all()來解決這些問題,並嘗試將數據傳遞給鏈中的下一個鏈接(createFile()),但Promise.all()在它移至createFile()後解析。
這是「反模式」回來咬我的例子嗎?如果是這樣,你們能否建議我應該如何重組,以便我能夠完成我準備要做的事情?
謝謝!
exports.getRawDataForExport = function(data) {
return new Promise(function(resolve, reject) {
var getTableName = function() {
return knex('monitored_parameter')
.where('device_id', data.device_id)
.whereIn('internal_name', data.param)
.select()
.then(function(rows) {
if(rows) {
var runningResult = {};
for(var i = 0; i < rows.length; i++) {
var tbl = {"table" : 'monitored_parameter_data_' + rows[i].id, "param" : rows[i].display_name};
runningResult.table = [];
runningResult.table.push(tbl);
}
return runningResult;
} else {
// if no MP row(s) found we cannot proceed
throw new Error("No history found for that parameter.");
}
});
}
var getData = function(runningResult) {
var promises = [];
if(data.date_start && data.date_end) {
// grab within range
for(var i = 0; i < runningResult.table.length; i++) {
promises.push(
knexHistory(runningResult.table[i].table)
.select('created', 'data_value as value', 'unit')
.whereBetween('created', [data.date_start, data.date_end])
);
}
// *** the chain moves on to createFile() before this data is passed along
Promise.all(promises).then(function(data) {
console.dir('inside promises.all');
console.dir(data);
runningResult.data = data;
return runningResult;
});
} else {
// grab all
for(var i = 0; i < runningResult.table.length; i++) {
promises.push(
knexHistory(runningResult.table[i].table)
.select('created', 'data_value as value', 'unit')
);
}
// *** the chain moves on to createFile() before this data is passed along
Promise.all(promises).then(function(data) {
console.dir('inside promises.all');
console.dir(data);
runningResult.data = data;
return runningResult;
});
}
}
var createFile = function(runningResult) {
var files = [],
zipFileName = filePathExport + 'Data_Export.zip';
for(var i = 0; i < runningResult.table.length; i++) {
var fields = ['created', 'value', 'unit'],
csvFileName = runningResult.param + '_export.csv',
csvFilePath = filePathExport + runningResult.param + '_export.csv';
var csv = json2csv({data : runningResult.data[i], fields : fields, doubleQuotes : ''});
fs.writeFileSync(csvFilePath, csv);
files.push(csvFilePath);
}
var zip = new admzip();
for(var j = 0; j < files.length; j++) {
var input = fs.readFileSync(files[i]);
zip.addFile(csvFileName, input, '', 0644);
}
zip.writeZip(zipFileName);
return zipFileName;
}
getTableName()
.then(getData)
.then(createFile)
.then(function(zipFile) {
resolve(zipFile);
})
.catch(function(err) {
resolve(err);
});
});
}
感謝您的快速回復,這種方法運作良好。 –