【问题标题】:how do I make my code synchronus in javascript如何使我的代码在 javascript 中同步
【发布时间】:2019-07-27 20:14:51
【问题描述】:

我想让我的代码同步,我习惯了 python 但现在正在尝试做 在量角器中测试东西,一些代码使用 javascript,下面是我的代码:

describe('screenshot take', () => { 

    var listLength = urlList.length

      for (let i = 0; i < listLength; i++) {
         it('screenshot taken', () => {
          console.log("0")

          TakeScreenshot(  urlList[i],i)  
         console.log("1")

         });
    }
});



function  TakeScreenshot(url,rank){
    console.log("2")

    browser.get(url)
    console.log("3")

    browser.takeScreenshot().then((png) =>{
       console.log("4")
       var stream =  createWriteStream( ImagePath+'.png');  
       stream.write(Buffer.from(png, 'base64'));
       stream.end; 
      console.log("5")


     }); 

}

当尝试查看我的控制台时,我得到以下输出

0
2
3
1
4
5

但我希望它是

    0
    2
    3
    4
    5
    1

我尝试过使用 .then() 和 browser.sleep() 但我无法使用它 我尝试通过 async/await 阅读但我不知道如何使用它。所以有人可以帮我解决这个问题

【问题讨论】:

  • 不要。使您的代码顺序化,但保持异步。
  • @Bergi 为什么会这样?
  • 这是因为browser.takeScreenshot() 返回了一个承诺。承诺需要时间来解决,除非您等待承诺解决,否则您的console.log("1") 将在.then 之前触发。
  • @johnsmith 如果可以解决您的问题,请记住将答案标记为已接受的答案 :)

标签: javascript asynchronous protractor synchronous


【解决方案1】:

使用异步函数时,您需要在其他异步函数上使用await,以使其余代码等待它们的响应。

describe('screenshot take', async () => { 

    var listLength = urlList.length

      for (let i = 0; i < listLength; i++) {
         it('screenshot taken', () => {

          console.log("0")

          await TakeScreenshot(  urlList[i],i)  

          console.log("1")

         });
    }
});



const TakeScreenshot = async (url,rank){
    console.log("2")

    browser.get(url)

    console.log("3")

    const png = await browser.takeScreenshot()

    console.log("4")

    var stream =  createWriteStream( ImagePath+'.png');  
    stream.write(Buffer.from(png, 'base64'));
    stream.end; 

    console.log("5")

}

请注意,不建议在异步函数中使用 for 循环。您可以在此处查看有关原因的更多信息https://eslint.org/docs/rules/no-await-in-loop

【讨论】:

  • 那么你建议用什么来代替 for 循环?我需要 url 列表中的所有链接
  • 这个例子应该可以正常工作,但在使用 async/await 时请记住它,因为您可能会遇到问题。它更多地与性能问题有关,而不是破坏任何东西。
  • 此外,如果我们 async/await 确保通过在配置文件中设置 SELENIUM_PROMISE_MANAGER: false 属性来关闭默认控制流。如果没有打开控制流,测试将变得不可靠。参考github.com/SeleniumHQ/selenium/issues/3037
猜你喜欢
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多