Пожалуйста, не смешивайте конструкторы Promise и другие с async и await.Это может быть намного проще, если вы просто используете функции await и async.И только один раз оберните функции, принимающие вызовы.
Чистая версия не будет иметь никакой бизнес-логики в конструкторах Promise и будет использовать await, а не асинхронную функцию.
Я нашелВторой пункт в программе, где он не ожидает завершения действия, заключается в том, что insertStreamData не возвращает обещание, которое выполняется, когда оно выполнено, что и является причиной проблемы с порядком.Я обновлю свой ответ.
Я вижу проблему в загружаемых файлах, где она имеет:
return Promise.all(promises);
});
resolve('something');
, которая должна быть
return Promise.all(promises).then(function () {
resolve('something');
});
Это изменение должно вызвать выводбыть hither, the end * 4, done
.Если вы хотите, чтобы insertStreamData происходил последовательно, а не параллельно, это требует другого изменения.
Моя версия скрипта:
function upload_wrapper(req, res) {
return new Promise(function(resolve, reject) {
upload(req, res, function (err) {
if (err) {
reject(err);
} else {
resolve();
}
});
})
}
let uploadfiles = async function(req, res) {
await upload_wrapper(req, res);
let promises = [];
if (Object.keys(req.files).length > 0) {
simpleLoop(req.files, function(value, key, lovey) {
promises.push(insertStreamData(req.files[key]["originalname"]));
});
console.log('hither');
}
await Promise.all(promises);
return 'something';
};
// insert uploaded csv data from files into db
function insertStreamData(filename) {
return new Promise(function(resolve, reject) {
var originalFileName = filename;
var thefilename = originalFileName.split('.');
var csvfile = "./public/files/" + originalFileName;
var stream = fs.createReadStream(csvfile, {
headers: true
});
var csvStream = csv();
csvStream.on("data", function(data) {
if (data[0] != 'Product #' && data[7] != 0) {
var item = new Product({
'Invoice': thefilename[0],
'Product #': data[0],
'SKU': data[1],
'UpcCode': data[2],
'Description': data[3],
'MfgNo': data[4],
'Vendor': data[5],
'Order Qty': data[6],
'Ship Qty': data[7],
'Min Sell': data[8],
'Retail': data[9],
'Cost': data[10],
'Ext Cost': data[11],
'Box': data[12]
});
item.save(function(error) {
if (error) {
//throw error;
csvStream.pause(); // here the stream should be destroyed if this stops at the first error
reject(error);
}
});
}
}).on("end", function() {
console.log('the end');
resolve('the end');
});
stream.pipe(csvStream);
});
}
let getincomingproducts = function() {
return Promise.resolve('done');
};
router.post('/uploaddata', async function(req, res) {
try {
let result = await uploadfiles(req, res);
let result = await getincomingproducts();
console.log(result);
res.redirect('/showdata');
} catch (err) {
console.log("Caught " + err)
}
});
Не проверено.Это все еще может быть улучшено.