首页 > 解决方案 > JavaScript - 如何将变量从一个异步函数传递到另一个?

问题描述

我花了好几个小时试图弄清楚这一点,但画了一个空白。

我需要将一个数组从一个异步函数传递给另一个。问题是,我对整个 async/await 世​​界都很陌生。

我的代码如下。我需要将元素传递给step2函数

var selenium = require('selenium-webdriver');
var Builder = selenium.Builder;
var By = selenium.By;
var Key = selenium.Key;
var util = selenium.util;
var firefox = require('selenium-webdriver/firefox');
var http = require('http');
var querystring = require('querystring');

async function startBot() {
  var driver = await new Builder().forBrowser('firefox').build();

  await driver.get('randomSite');

  if(true){//Putting this here as it may have to do with scope. I am not sure

    async function step1(){
      for(var p=0; p <5 ; p++){//elems is undefined
        var elem1 = await driver.findElement(By.xpath("/html/body/div/div[1]")).getText();
        var elem2 = await driver.findElement(By.xpath("/html/body/div/div[2]")).getText();

        var elems = [elem1, elem2]; //How do I pass this array to tge step2 funtion?
      }
    }

    if(true){//Putting this here as it may have to do with scope. I am not sure

      var char1 = 1;
      var char2 = 2;

      //button1
      async function step2(){
        for (var i = 0; i < 2; i++) {
          if(elems[i] == char1){//elems is undefined
            await driver.findElement(By.xpath("/html/body/div/div[" + i + "]")).click().then(function(res, err){
              if(err){ reject(err); };
            });
            break;
          }
        }
      }

      await step1();
      await step2();

    }
  } 
};

startBot();

标签: async-await

解决方案


您可以将 elems 数组作为参数传递给 step2 函数。但是,您必须进行一些修改:

async function step1(){
  for(var p=0; p <5 ; p++){
    var elem1 = await driver.findElement(By.xpath("/html/body/div/div[1]")).getText();
    var elem2 = await driver.findElement(By.xpath("/html/body/div/div[2]")).getText();

    var elems = [elem1, elem2];
  }
  return step2(elems);
}

async function step2(elems){
  for (var i = 0; i < 2; i++) {
    if(elems[i] == char1){
      await driver.findElement(By.xpath("/html/body/div/div[" + i + "]")).click().then(function(res, err){
        if(err){ reject(err); };
      });
      break;
    }
  }
}

并且仅将 await 与 step1 功能一起使用:

 await step1();

那是因为我们step2(elems)从 step1 函数返回了另一个 Promise。因此,await 关键字将不得不等待 step1 和 step2。请记住,当您调用异步函数时,您总是会得到一个承诺。


推荐阅读