Foreach с Promise, не дожидаясь результатов метода

1

Я пытаюсь выполнить итерацию через файлы JSON, сгенерированные тестами транспортира. Я вытаскиваю все имена файлов в массив и вызываю метод, который открывает и анализирует каждый файл, публикует результаты в базе данных и передает флаг прошедшего/сбой.

Я пробовал все примеры здесь. Сделать угловым.Почему ждать обещания после перехода к следующему объекту и получить те же результаты.

Метод фактически вызывается, но результаты не отправляются в db. Я проверил parser.parseResults в отдельном файле, и он успешно отправлен в db, поэтому он должен иметь какое-то отношение к обещанию, которое не будет правильно разрешено.

Невозможно ли сделать что-то подобное в структуре жасмина/транспортира? Или у меня что-то не так в коде?

Я включил код для моей последней попытки. Благодарю Кристину

matches.reduce(function (p, val) {
    console.log('val', val);
    return p.then(function () {
          return parser.parseResults(val);
     });
   }, Promise.resolve()).then(function (finalResult) {
       console.log('finalResult = ', finalResult);
   }, function (err) {
       console.log('error in reduce',err);
   });

parser.parseРезультаты

protractorParser.prototype.parseResults = function (fileName) {
    return new Promise((resolve, reject) => {

        console.log('In parseresults', fileName);
        json.readFile(fileName, function (err, obj) {
            try {

                if (err != null) {
                    console.log('error reading file',err);
                    reject(err);
                }
                console.log('obj - ',obj);
                var results = [];

                var Passed = 0;
                var Message = '';
                var Stack = '';
                for (var suite in obj) {
                    var specs = obj[suite].specs;
                    console.log('spec - ', specs);
                    if (specs.length > 0) {
                        for (var i = 0; i < specs.length; i++) {
                            var assert = specs[i];
                            var tcR = new RegExp(/TC[\d]+/);
                            var tc = assert.description.match(tcR);

                            if (!assert.failedExpectations.length) {
                                Passed = 1;
                            }
                            else {
                                assert.failedExpectations.forEach((expectation) => {
                                    Message = expectation.message;
                                    Stack = expectation.stack.split('\n')[1].trim();
                                })
                                Passed = 0;
                            }
                            if (tc != null) {
                                utility.TestDataManager.insertAutomationResults(tc[0], assert.description, Passed, process.env.testBuild,
                                    'P', Message, Stack, 0, moment().utcOffset(config.get('settings.timeOffset')).format('YYYY-MM-DDTHH:mm:ss'), '')
                                    .then(function (resp) {
                                        resolve(Passed);

                                    }, (err) => {
                                        console.log('Posting to Database failed ', err);
                                        reject(err);
                                    });
                            } else {
                                console.log('no test case found for test: ' + assert.description + ' -- skipping');
                                reject(err); 
                            }
                        }
                    }
                }
            }
            catch (err) {
                console.log('rejecting opening file');
                reject(err);
            }
        });
    })
}
  • 0
    Пожалуйста, также parser.parseResults код parser.parseResults (и что-нибудь важное, что он использует). Фрагмент, который вы разместили, теперь в порядке.
Теги:
arrays
protractor
jasmine

1 ответ

1
Лучший ответ

Если в объекте не имеется ровно одного набора, с точно одной спецификацией, то ваше обещание либо разрешается вовсе, либо несколько раз.

Избегайте обертывания слишком большого количества вещей в new Promise конструкторе new Promise - всегда обещайте на минимально возможном уровне и впоследствии используйте цепочку обещаний.

protractorParser.prototype.parseResults = function (fileName) {
    return new Promise((resolve, reject) => {
        console.log('In parseresults', fileName);
        json.readFile(fileName, function (err, obj) {
            if (err != null) {
                console.log('error reading file', err);
                reject(err);
            } else {
                resolve(obj);
            }
        });
    }).then(function(obj) {
        console.log('obj - ',obj);
        var results = [];

        for (var suite in obj) {
            var specs = obj[suite].specs;
            console.log('spec - ', specs);
            for (let i = 0; i < specs.length; i++) {
                const assert = specs[i];
                const tcR = /TC[\d]+/;
                const tc = assert.description.match(tcR);

                let Passed = 1;
                let Message = '';
                let Stack = '';
                if (assert.failedExpectations.length) {
                    const expectation = assert.failedExpectations[assert.failedExpectations.length-1];
                    Passed = 0;
                    Message = expectation.message;
                    Stack = expectation.stack.split('\n')[1].trim();
                }
                if (tc != null) {
                    const time = moment().utcOffset(config.get('settings.timeOffset')).format('YYYY-MM-DDTHH:mm:ss');
                    const promise = utility.TestDataManager.insertAutomationResults(tc[0], assert.description, Passed, process.env.testBuild, 'P', Message, Stack, 0, time, '');
                    results.push(promise.catch(err => {
                        console.log('Posting to Database failed ', err);
                        throw err;
                    }));
                } else {
                    console.log('no test case found for test: ' + assert.description + ' -- skipping');
                    // I don't think you want to 'throw err' here, right?
                }
            }
        }
        return Promise.all(results);
    });
};
  • 0
    Привет, Большое спасибо за ответ. Очевидно, я ОЧЕНЬ новичок в программировании на javascript, и я унаследовал код от кого-то еще .... тааак. Попытка выяснить все это. На самом деле в каждом файле только 1 набор и 1 спецификация. Раньше их было несколько, но все изменилось.
  • 0
    Поэтому я бы использовал приведенный выше код match.reduce для правильного вызова метода parseResults?
Показать ещё 10 комментариев

Ещё вопросы

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