javascript - 带有 Promise 的 Foreach 不等待方法结果

标签 javascript arrays jasmine protractor

我正在尝试遍历 Protractor 测试生成的 JSON 文件。我将所有文件名拉入一个数组并调用一个方法打开并解析每个文件,将结果发布到数据库并传回通过/失败标志。

我已经尝试了这里所有的例子 Make angular.forEach wait for promise after going to next object仍然得到相同的结果。

该方法实际被调用,但结果没有发布到数据库。我已经在单个文件上测试了 parser.parseResults,它已成功发布到数据库,因此它必须与未正确解析的 promise 有关。

难道在 jasmine/protractor 框架中不能做这样的事情吗?还是我的代码有问题?

我已经包含了我最近一次尝试的代码。 谢谢 克里斯汀

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.parseResults代码

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);
            }
        });
    })
}

最佳答案

如果 obj 中不完全有一个套件,只有一个规范,那么你的 promise 要么根本没有解决,要么多次解决。

避免在 new Promise 构造函数中包装太多东西 - 始终在尽可能小的级别上进行 promise,然后使用 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);
    });
};

关于javascript - 带有 Promise 的 Foreach 不等待方法结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48773253/

相关文章:

javascript - 函数在 jQuery 每个循环中间返回不正确的值

javascript - 为什么使用 jQuery 加载文档时不能直接调用函数?

php - 数组 PHP 到 JavaScript?

c - 在 C 中操作字符串数组

angular - 使用 jasmine 和 Protractor 运行端到端测试时捕获控制台错误

javascript - 如何对另一个函数内的函数被调用进行单元测试?

javascript - 在javascript中模拟文本框编辑操作

asp.net - 如何处理 $.ajax POST (JQuery) 中的单引号?

javascript - 如何在 JSON 对象中访问此嵌套数组?

javascript - 如何为 Jasmine/Angular 创建一个助手来组合多个 beforeEach