gpt4 book ai didi

javascript - Promise Chain Breaks w/.all()

转载 作者:行者123 更新时间:2023-11-30 08:27:24 26 4
gpt4 key购买 nike

我是相当新的 promise ,并认为我能处理事情,但显然我没有。

以下代码旨在获取 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);
});

});
}

最佳答案

您需要返回 Promise.all(...).then(...) 的结果(在这两种情况下),以便 getData 返回一个 promise 。

而且,是的,您正在使用 promise constructor antipattern , 虽然这不是问题的原因。

移除 return new Promise(function(resolve, reject) { 包装器,然后像这样返回:

return getTableName().then(getData)

... 省略对 resolve

的调用

关于javascript - Promise Chain Breaks w/.all(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43379325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com