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否,请查看第二个代码段。