Последовательное выполнение асинхронных методов на основе массива переменных - PullRequest
0 голосов
/ 13 мая 2018

У меня есть массив ответов.

var answers = ['Yes', 'No', 'Yes']; 

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

Я ввожу ответы, используя следующий метод.

var answerQuestion = function(driver, answer) {
    var defer = q.defer();

    var elementXPath = "//*[contains(@class, 'quizAnswer’)]";
    var delay = 2000;

    return driver.waintUntilVisible(elementXPath, delay).sendKeys(answer);
};

Теперь я хочу выполнить вышеупомянутый метод для каждого ответа в массиве answers последовательнопоскольку следующий вопрос не будет отображаться до тех пор, пока на текущий вопрос не будет получен ответ.

Простой цикл foreach не выполняется здесь.

function submitAnswers(driver) {
    answers.forEach(function(answer) {
        answerQuestion(driver, answer);
    });
}

Итак, как последовательно выполнять асинхронные методы на основемассив переменных.

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Так как функции селена возвращают обещания, вам придется выполнять их последовательно, один за другим.

В вашем случае следующее должно сделать магию.

var answerQuestion = function(driver, answer) {
    return function() {
       var defer = q.defer();
       var elementXPath = "//*[contains(@class, 'quizAnswer’)]";
       var delay = 2000;
    return driver.waintUntilVisible(elementXPath,delay).sendKeys(answer);
};

function submitAnswers(driver) {
    return answers.reduce((previous, answer) => {
                return previous.then(answerQuestion(driver, answer);
            }, Promise.resolve());
}
0 голосов
/ 13 мая 2018

Я наконец нашел способ.кредит Дэйв Седдиа

var answers = ['Yes', 'No', 'Yes'];

var answerQuestion = function(driver, answer) {
    var elementXPath = "//*[contains(@class, 'quizAnswer’)]";
    return driver.waintUntilVisible(elementXPath, delay).sendKeys(answer);
};

function submitAnswers(driver) {

    var chain = q.when();

    answers.forEach(function(answer) {
        chain = chain.then(function() {
            return answerQuestion(driver, answer);
        });
    });
}
0 голосов
/ 13 мая 2018

Сначала answerQuestion должно быть многообещающим:

function answerQuestion(driver, answer) {
 var elementXPath = "//*[contains(@class, 'quizAnswer’)]";
 var delay = 2000;

 return driver.waintUntilVisible(elementXPath, delay).sendKeys(answer);
}

Тогда это довольно просто:

function submitAnswers(driver, position = 0) {
    if(position >= answers.length) return;

    return answerQuestion(answers[position]).then(function() {
      return submitAnswers(driver, position + 1);
    });
 }

Или, если вы можете использовать async / await:

async function submitAnswers(driver, answers) {
  for(const answer of answers)
     await answerQuestion(answer);
 }
...