Я знаю, что это, вероятно, очень простой вопрос, но я просто учимся и застрял. Я не могу обернуть мой разум, как делать то, что мне нужно сделать здесь.

У меня есть этот массив под названием 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.executyType является «регрессией», мне нужно итерации через 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.executionType = «регрессия», звонки в intry.dataarray.reduce.

Он обрабатывает все записи DABARAY через метод Module.adtteStCaseToset, как мне нужен и возвращается назад и печатает Console.log («AddResults», AddResults); от обещания. Продвигайтесь в.

Затем он останавливается.

То, что я не смог выяснить, как добраться, чтобы продолжать итереть через оставшиеся предметы RallyResults. Я попытался приложить решение, когда он возвращается из метода Module.adttteStCaseToset, но это заканчивается весь процесс и до сих пор не обрабатывает все элементы RallyResult.

Вот метод addttestcasetoset

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
Christine Edwards 8 Мар 2018 в 00:50

1 ответ

Лучший ответ

Ни ProcessDatabase.addTestCaseToSet(), ни ProcessDatabase.ckForAddToSet() нуждается в явном new Promise(). Есть много возможностей, чтобы вернуться, естественно, происходит обещания.

ProcessDatabase.addTestCaseToSet() выглядит чрезмерно защищено и довольно запутано в области addToSet / addResults / results / 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(), используемой для внутреннего цикла.

Попробуйте что-то вроде этого:

ProcessDatabase.prototype.ckForAddToSet = function(rallyResults) {
    var module = this;
    return rallyResults
    .filter(entry => entry.ExecutionType === 'regression' || entry.ExecutionType == 'smoke')
    .map(entry => entry.dataArray)
    .reduce((promise0, dataArray) => {
        return promise0.then(arr0 => {
            return dataArray.reduce((promise1, data) => {
                return promise1.then(arr1) => {
                    return module.addTestCaseToSet(data)
                    .then(result1 => {
                        arr1.push(result1);
                        return arr1;
                    });
                });
            }, Promise.resolve([]))
            .then(result0 => {
                arr0.push(result0);
                return arr0;
            });
        });
    }, Promise.resolve([]))
    .then(addResults => {
        console.log('addResults ', addResults); // addResults will be an array of arrays.
    }, err => {
        console.log('error in reduce in ckForAddToSet', err);
    });
};

Вероятно, есть еще какая-то работа, но это должно быть намного ближе к тому, что вы хотите.

1
Roamer-1888 9 Мар 2018 в 04:13