Цепная неоднозначность обещания в транспортире - PullRequest
0 голосов
/ 20 декабря 2018

Я использую EXCELJS для чтения данных из файла Excel.Создана функция allinExcel , которая возвращает значения столбца в обещании.Поскольку мне нужны 2 столбца, я связал аналогичные функции обещания - allinExcel .В этом контексте, однако, я получаю ожидаемые результаты, а иногда нет, что неоднозначно.Файл ProExcel состоит из 2 столбцов. Ожидаемый результат от приведенного ниже кода - 2 массива, который включает в себя содержимое каждого столбца.Любая помощь в этом очень полезна.Ожидаемый результат - [ <1 empty item>, 'GEL', 'BEL', 'HEL', 'SEL' ] [ <1 empty item>, 55, 555, 66, 666 ] Но если я получу значение столбца, используя одно обещание, я получу результат каждый раз без какой-либо двусмысленности.

describe("Excel Read ",function(){
   function allinExcel(colNum){
    var Excel = require('exceljs');
    var workbook = new Excel.Workbook();
    var excelFilePath  = "ExcelData/ProExcel.xlsx"
    return workbook.xlsx.readFile(excelFilePath).then(function() {
      var worksheet=workbook.getWorksheet('Sheet1');
      return worksheet.getColumn(colNum+1).values
    },function(error){
      console.log(error)
       return fail
    })
  }
it("Excel Operation",function(){
    allinExcel(0).then(function(col0){
      allinExcel(1).then(function(col1){
        console.log(col1,col0)

      })

    })
})

Ниже приведен файл conf.js

// conf.js

var Jasmine2HtmlReporter = require('protractor-jasmine2-html-reporter');

exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  getPageTimeout:20000, // browser.get timeout
  allScriptsTimeout: 360000, // Time to load the DOM
  jasmineNodeOpts: {defaultTimeoutInterval: 50000}, //For individual it
  framework: 'jasmine',
  capabilities: {
    'browserName': 'chrome',

    chromeOptions: {
      args: [
        '--start-maximized','disable-infobars'//,'--headless'
      ]
    }
  },

onPrepare: function() {
  global.EC = protractor.ExpectedConditions,
  jasmine.getEnv().addReporter(
    new Jasmine2HtmlReporter({
      savePath: 'target/reports',
      screenshotsFolder: 'images',
      takeScreenshots: true,
      takeScreenshotsOnlyOnFailures: true,
      fixedScreenshotName: false,
      fileName: 'currentRun',
      cleanDestination: true
    })
  );

},
jasmineNodeOpts: {
  showColors: true, // Use colors in the command line report.
},

specs: ['specs/WebTables.js'],

};

1 Ответ

0 голосов
/ 21 декабря 2018

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

  1. Создать временную папку
  2. Создать файл с именем: test.js in the temp folder и скопируйте следующий код в файл.
  3. Скопируйте Excel ProExcel.xlsx во временную папку
  4. Откройте окно cmd и введите временную папку
  5. Запустите node test.js в окне cmd

    // test.js 
    function allinExcel(colNum) {
        var Excel = require('exceljs');
        var workbook = new Excel.Workbook();
        var excelFilePath = "ProExcel.xlsx"
        return workbook.xlsx.readFile(excelFilePath).then(function () {
            var worksheet = workbook.getWorksheet('Sheet1');
            return worksheet.getColumn(colNum + 1).values
        }, function (error) {
            console.log(error)
            return fail
        })
    }
    
    
    [1, 2, 3, 4, 5, 6, 7].forEach(function (it, index) {
    
        allinExcel(0).then(function (col0) {
            allinExcel(1).then(function (col1) {
    
                console.log('\n#### ' + index)
                console.log(col0, col1)
    
            })
        })
    
    })
    

Если вы не можете получить один и тот же результат в каждом цикле, измените версию вашего nodejs (я использовал v10.9.0).

Если вы можете получить один и тот же результат в каждом цикле, проблема возникает со стороны транспортира.

Добавьте return для каждой вложенной функции для then(), запустите снова.

it("Excel Operation",function(){
    allinExcel(0).then(function(col0){
      return allinExcel(1).then(function(col1){
        return console.log(col1,col0)

      })

    })
})
...