Цепочка обещаний не в состоянии

1

Не удалось понять, почему цепочка обещаний '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);
    });
  • 0
    Не могли бы вы включить или указать строку, по которой вы пытаетесь then выполнить цепочку обещаний?
  • 0
    Вы получаете какие-либо ошибки?
Показать ещё 11 комментариев
Теги:
promise

1 ответ

1

Во-первых, чтобы проверить, есть ли отклонение, попробуйте

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)
    );
  • 0
    Спасибо за отзыв, это большое улучшение в моем коде. Верьте или нет, я все еще не получаю подвох или выполнение при вызове descriptionDir, хотя код все еще выполняется. Возможно, где-то в моем коде есть ошибка, которую ест Node? Я буду продолжать расследование, прежде чем публиковать что-то более полезное

Ещё вопросы

Сообщество Overcoder
Наверх
Меню