迭代数组,然后在带有promise的数组上调用.reduce

时间:2018-03-07 21:50:55

标签: javascript arrays promise

我知道这可能是一个非常基本的问题,但我只是在学习而且被卡住了。我无法解决如何做我需要做的事情。

我有一个名为RallyResults的数组



rallyResults [ { ExecutionType: 'ci',
    dataArray:
     [ [Object],
       [Object],
       [Object],
       [Object],
       [Object],
       [Object],
       [Object],
       [Object] ] },
    { ExecutionType: 'regression',
    dataArray: [ [Object], [Object], [Object], [Object], [Object], [Object] ] },
     { ExecutionType: 'ci',
    dataArray: [ [Object], [Object], [Object], [Object], [Object], [Object] ] }
  { ExecutionType: 'regression',
    dataArray: [ [Object], [Object], [Object], [Object], [Object] ] } ]




我需要遍历rallyResults数组,当rallyResults.ExecutionType为"回归"时,我需要遍历rallyResults.dataArray,并对rallyResults.dataArray中的每个项目进行一些处理。我只想在处理rallyResults.dataArray中的所有项目时返回。

我为代码尝试了几次不同的迭代而没有成功。这就是我现在编码的内容。



ProcessDatabase.prototype.ckForAddToSet = function (rallyResults) {
    return new Promise((resolve, reject) => {
        var module = this;
        console.log('In ckForAddToSet')
        //console.log('rallyResults', rallyResults);


        rallyResults.forEach(function (entry) {
            //console.log('in ckForAddToSetentry', entry);
            if (entry.ExecutionType == 'regresstion' || entry.ExecutionType 
                                               == 'smoke') {
                 entry.dataArray.reduce(function (p, val) {
                    return p.then(function () {
                        return module.addTestCaseToSet(val);
                    });
                }, Promise.resolve()).then(function (addResults) {
                    console.log('addResults ', addResults);
                }, function (err) {
                    console.log('error in reduce in ckForAddToSet', err);
                });
            }
        });
    })
}




它开始遍历rallyResults并找到第一个项目,其中rallyResults.ExecutionType =' regression',调用entry.dataArray.reduce。

它通过module.addTestCaseToSet方法处理所有dataArray记录,就像我需要它并返回并打印console.log(' addResults',addResults);来自.reduce中的promise.resolve。

然后停止。

我还没弄清楚如何让它继续迭代剩余的拉力赛结果项目。当我从.reduce中的module.addTestCaseToSet方法返回时,我确实尝试了解决方案,但是这结束了整个过程并且仍然没有处理所有的rallyResult项目。

这是addTestCaseToSet方法



ProcessDatabase.prototype.addTestCaseToSet = function (data) {
    return new Promise((resolve, reject) => {

        console.log('in addTestCaseToSet', data);
        var dataValues = {
            data: [],
            tcvalues: []
        }
        dataValues.data = data;
        //console.log('dataValues.data', dataValues.data);
        rallyApi.getTestCase(dataValues.data.TestCaseId).then((values) => {

            dataValues.tcvalues = values;
            //console.log('dataValues = ',dataValues);
            resolve(dataValues);
        }, err => { reject('… failed finding testCase ' + dataValues.data.TestCaseId, err); });


    }).then(function (dataValues) {
        var module = this;
        var addToSet = [];
        const promise = new Promise((resolve, reject) => {
            rallyApi.addTestCaseToSet(dataValues.tcvalues.ObjectID, dataValues.tcvalues.Ref, dataValues.data.TsObjectId, dataValues.data.TsRef).then((results) => {
                addToSet = results;
                resolve(addToSet);
            }, (err) => { reject(err); });
        });

        results.push(promise.then(() => {
            addResults.push(addToSet);
        },
            err => { console.log('… failed', err); throw err; }
        ));
        return Promise.all(results).then(() => addResults);

    })
}




module.addTestCaseToSet的结果如下:



addResults  [ { tsRef: 'https://rally1.rallydev.com/slm/webservice/v2.0/testset/203724645320',
    tcRef: 'https://rally1.rallydev.com/slm/webservice/v2.0/testcase/152495978580',
    action: 'added' },
  { tsRef: 'https://rally1.rallydev.com/slm/webservice/v2.0/testset/203724645320',
    tcRef: 'https://rally1.rallydev.com/slm/webservice/v2.0/testcase/192221079432',
    action: 'added' },
  { tsRef: 'https://rally1.rallydev.com/slm/webservice/v2.0/testset/203724645320',
    tcRef: 'https://rally1.rallydev.com/slm/webservice/v2.0/testcase/128260769452',
    action: 'added' }]




非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

CREATE VIEW TEST AS SELECT T1.DATE, T1.ACTNBR, CASE WHEN EXISTS (SELECT COLUMN1 FROM TABLE T2 WHERE T2.ACTNBR = T1.ACTNBR AND T2.DATE = T1.DATE) THEN calculation1 ELSE calculation2 END CAL_COLUMN FROM TABLE T1 ProcessDatabase.addTestCaseToSet()都不需要明确的ProcessDatabase.ckForAddToSet()。有很多机会回归自然发生的承诺。

new Promise()看起来过于复杂,而且在ProcessDatabase.addTestCaseToSet() / addToSet / addResults方面相当混乱。

最简单的是,results可能写成如下:

ProcessDatabase.addTestCaseToSet()

ProcessDatabase.prototype.addTestCaseToSet = function(data) { return rallyApi.getTestCase(data.TestCaseId) .then(values => rallyApi.addTestCaseToSet(values.ObjectID, values.Ref, data.TsObjectId, data.TsRef)) .catch(err => { throw new Error('… failed adding testCase ' + data.TestCaseId + ' (' + err.message + ')'); }); }; 的重写中,做出以下假设:

  • ProcessDatabase.addTestCaseToSet()返回结果或承诺结果(不是承诺数组)。
  • 不需要任何副作用,并且通过返回的承诺交付结果符合函数的要求。

rallyApi.addTestCaseToSet()中,模式ProcessDatabase.ckForAddToSet()仅部分符合串行呼叫rallyResults.forEach(function(entry) => { ...; entry.dataArray.reduce(...) });的目标。为了完全实现该目标,需要使用用于内循环的相同module.addTestCaseToSet(data)模式替换外循环(.forEach())。

尝试这样的事情:

.reduce()

可能还有一些工作要做,但这应该更接近你想要的。