Не удалось понять, почему цепочка обещаний 'describeDir' тогда не способна. У кого-нибудь есть идея, что я испортил здесь? Весь код, похоже, исполняется, но любая функция api обещания, например, тогда или, наконец, никогда не будет выполнена. Ниже приведены две функции верхнего уровня. Репозиторий github находится по адресу https://github.com/PhoenixContactUSA/pcworx-docgen
function updateDescriptor(fileloc, wsName, outdir){
console.log('Updating descriptor file for: ' + wsName);
return new Promise(function(resolve, reject){
return getDescriptor(outdir).then(
(value) => {
let descriptorFile = value;
var comments = getComments(fileloc);
var variables = getVariables(fileloc);
//wait until both are completed before continuing
return Promise.all([comments, variables]).then((values) => {
//var descriptor = new Object();
//console.log(JSON.stringify(descriptor));
descriptorFile[wsName] = new Object();
//console.log(JSON.stringify(descriptor));
//var worksheet = new Object();
descriptorFile[wsName].comments = values[0];
descriptorFile[wsName].variables = values[1];
//save the file
return saveDescriptor(descriptorFile, outdir).then((value) => {
console.log('Completed ' + wsName + ' ' + value);
resolve(value);
}, (reason) => {console.log(reason)})
}, (reason) => {
console.log(reason);
}
)
},
(reason) => {console.log(reason)}
)
})
}
function describeDir(filedir, outdir){
var files = findFilesInDir(filedir, '.XML');
for (var k=0;k<files.length;k++){
if ((files[k].indexOf('@HW') !== -1) || (files[k].indexOf('@LIBS') !== -1) || (files[k].indexOf('@ROOT') !== -1) || (files[k].indexOf('run') !== -1)) {
files.splice(k,1);
}
}
return Promise.each(files, function(file){
return updateDescriptor(file, path.basename(file), outdir);
});
}
Затем я вызываю функции здесь. Кажется, что код выполняется просто отлично, но then() никогда не вызывается. Обратите внимание, что я использую bluebird в этой последней редакции.
//generate the output files, then copy them to the destination
docProcessor.describeDir(folder, path.join(__dirname, '..')).then((value)=>{
console.log('docProcessor then entered: ' + value);
});
Во-первых, чтобы проверить, есть ли отклонение, попробуйте
docProcessor.describeDir(folder, path.join(__dirname, '..'))
.then(value => console.log('docProcessor then entered:', value))
.catch(reason => console.error('error', reason);
Потенциальная проблема в describeDir
- это цикл, который вы используете для фильтрации файлов с помощью @HW
@LIBS
@ROOT
или run
имя
Когда вы сплайсируете массив файлов на k
, k++
все еще выполняется, поэтому вы пропустите тестирование следующего файла
т.е.
array = [a, b, c, d];
k == 1 // testing "b"
array.splice(k, 1);
now array = [a, c, d]
k++; // == 2
next iteration checks "d"
Поэтому, если в файле есть два файла подряд с одной из этих строк, вы пропустите "удаление" - это может быть проблемой?
Вместо этого вы хотите использовать фильтр
function describeDir(filedir, outdir) {
var files = findFilesInDir(filedir, '.XML')
.filter(file =>
file.indexOf('@HW') == -1 &&
file.indexOf('@LIBS') == -1 &&
file.indexOf('@ROOT') == -1 &&
file.indexOf('run') == -1
);
return Promise.each(files, file => updateDescriptor(file, path.basename(file), outdir));
}
или аккуратный
function describeDir(filedir, outdir) {
var files = findFilesInDir(filedir, '.XML')
.filter(file => !/@HW|@LIBS|@ROOT|run/.test(file));
return Promise.each(files, file => updateDescriptor(file, path.basename(file), outdir));
}
В качестве бонуса следующая функция updateDescriptor
очищается и сглаживается и модернизируется с использованием последних ES2015+ функций кодирования (с вашими комментариями нетронутыми)
function updateDescriptor(fileloc, wsName, outdir) {
console.log('Updating descriptor file for: ' + wsName);
return getDescriptor(outdir)
.then(value => Promise.all([getComments(fileloc), getVariables(fileloc), value]))
.then(([comments, variables, descriptorFile]) => {
//var descriptor = new Object();
//console.log(JSON.stringify(descriptor));
//console.log(JSON.stringify(descriptor));
//descriptorFile[wsName] = new Object();
//var worksheet = new Object();
descriptorFile[wsName] = {comments, variables};
//save the file
return saveDescriptor(descriptorFile, outdir)
}).then((value) => {
console.log('Completed ' + wsName + ' ' + value);
return value
})
}
Обратите внимание на отсутствие кода catch
, так как вы хотите, чтобы ошибки сохранялись в цепочке
действительно компактная версия updateDescriptor
const updateDescriptor = (fileloc, wsName, outdir) => getDescriptor(outdir)
.then(value => Promise.all([getComments(fileloc), getVariables(fileloc), value]))
.then(([comments, variables, descriptorFile]) =>
saveDescriptor(Object.assign(descriptorFile, {
[wsName] : { comments, variables }
}), outdir)
);
then
выполнить цепочку обещаний?