Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于变量数组顺序执行异步方法_Javascript_Arrays_Promise_Q - Fatal编程技术网

Javascript 基于变量数组顺序执行异步方法

Javascript 基于变量数组顺序执行异步方法,javascript,arrays,promise,q,Javascript,Arrays,Promise,Q,我有一系列的答案 var answers = ['Yes', 'No', 'Yes']; 我必须在网络测验中输入这些答案,然后依次弹出问题。我使用selenium驱动程序来感知问题 我使用以下方法输入答案 var answerQuestion = function(driver, answer) { var defer = q.defer(); var elementXPath = "//*[contains(@class, 'quizAnswer’)]"; var

我有一系列的答案

var answers = ['Yes', 'No', 'Yes']; 
我必须在网络测验中输入这些答案,然后依次弹出问题。我使用selenium驱动程序来感知问题

我使用以下方法输入答案

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

因此,如何基于变量数组顺序执行异步方法。

首先回答问题:

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
/
wait

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

首先,回答问题应该是有希望的:

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
/
wait

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

由于selenium函数返回承诺,因此必须依次解析

对于你的情况,下面应该做的魔术

var answerQuestion=功能(驱动程序,答案){
返回函数(){
var defer=q.defer();
var elementXPath=“//*[包含(@class,'quizAnswer')]”;
var延迟=2000;
返回驱动程序.waintUntilVisible(elementXPath,delay).sendKeys(应答);
};
函数提交者(驱动程序){
返回答案。减少((上一个,答案)=>{
返回上一个。然后(回答问题(司机,回答);
},Promise.resolve());

}
由于selenium函数返回承诺,因此必须依次解析

对于你的情况,下面应该做的魔术

var answerQuestion=功能(驱动程序,答案){
返回函数(){
var defer=q.defer();
var elementXPath=“//*[包含(@class,'quizAnswer')]”;
var延迟=2000;
返回驱动程序.waintUntilVisible(elementXPath,delay).sendKeys(应答);
};
函数提交者(驱动程序){
返回答案。减少((上一个,答案)=>{
返回上一个。然后(回答问题(司机,回答);
},Promise.resolve());

}
我终于想出了一个办法。归功于


我终于想出了一个办法。归功于


我不能使用async await,因为我没有在构建中集成babel。没有它,我仍然必须使用循环调用'submitAnswers'。结果将与以前一样。@Giridhar没有,请看第二个代码段。我不能使用async await,因为我没有在构建中集成babel。没有它,我仍然必须调用'su'bmitAnswers'使用循环。结果将与以前相同。@Giridhar否,请查看第二个代码段。