Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.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_Asynchronous_Protractor_Synchronous - Fatal编程技术网

如何在javascript中使代码同步

如何在javascript中使代码同步,javascript,asynchronous,protractor,synchronous,Javascript,Asynchronous,Protractor,Synchronous,我想让我的代码同步,我已经习惯了python,但现在正在尝试 在量角器中进行测试,有些代码使用javascript,下面是我的代码: describe('screenshot take', () => { var listLength = urlList.length for (let i = 0; i < listLength; i++) { it('screenshot taken', () => { cons

我想让我的代码同步,我已经习惯了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
    4
    5
    1

我尝试过使用.then()和browser.sleep(),但我无法使用它。我尝试过通过async/await阅读,但我不知道如何使用它。因此,当使用异步函数时,您需要在其他异步函数上使用
wait
,以使其余的代码等待它们的响应

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")

}
description('screenshot-take',async()=>{
var listLength=urlList.length
for(设i=0;i{
控制台日志(“0”)
等待截图(urlList[i],i)
控制台日志(“1”)
});
}
});
const TakeScreenshot=async(url,排名){
控制台日志(“2”)
browser.get(url)
控制台日志(“3”)
const png=await browser.takeScreenshot()
控制台日志(“4”)
var stream=createWriteStream(ImagePath+'.png');
stream.write(Buffer.from(png,'base64'));
stream.end;
控制台日志(“5”)
}

请注意,不建议在异步函数中使用for循环。您可以在此处查看有关为什么在使用异步函数时需要在其他异步函数上使用
wait
以使其余代码等待响应的更多信息

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")

}
description('screenshot-take',async()=>{
var listLength=urlList.length
for(设i=0;i{
控制台日志(“0”)
等待截图(urlList[i],i)
控制台日志(“1”)
});
}
});
const TakeScreenshot=async(url,排名){
控制台日志(“2”)
browser.get(url)
控制台日志(“3”)
const png=await browser.takeScreenshot()
控制台日志(“4”)
var stream=createWriteStream(ImagePath+'.png');
stream.write(Buffer.from(png,'base64'));
stream.end;
控制台日志(“5”)
}

请注意,不建议在异步函数中使用for循环。您可以在此处查看有关为什么不这样做的更多信息。让你的代码保持顺序,但保持异步。@Bergi为什么会这样?这是因为
browser.takeScreenshot()
返回一个承诺。承诺需要时间来解决,除非您等待承诺解决,否则您的
控制台.log(“1”)
将在
之前触发。然后
@johnsmith记住,如果某个答案能够解决您的问题,请将其标记为已接受的答案:)不要。让你的代码保持顺序,但保持异步。@Bergi为什么会这样?这是因为
browser.takeScreenshot()
返回一个承诺。承诺需要时间来解决,除非您等待承诺解决,否则您的
控制台.log(“1”)
将在
之前触发。然后
@johnsmith记住,如果某个答案能够解决您的问题,请将其标记为已接受的答案:)那么,您建议如何代替for循环?我需要一个urlsIt列表中的所有链接,在这个示例中应该可以正常工作,但在以后使用async/await时请记住,因为您可能会遇到问题。它更多地涉及性能问题,而不是破坏任何东西。此外,如果我们异步/等待,请通过在配置文件中设置
SELENIUM\u PROMISE\u MANAGER:false
属性来确保关闭默认控制流。如果控制流未打开,测试将变得不可靠。那么,你建议用什么来代替for循环呢?我需要一个urlsIt列表中的所有链接,在这个示例中应该可以正常工作,但在以后使用async/await时请记住,因为您可能会遇到问题。它更多地涉及性能问题,而不是破坏任何东西。此外,如果我们异步/等待,请通过在配置文件中设置
SELENIUM\u PROMISE\u MANAGER:false
属性来确保关闭默认控制流。如果控制流未打开,测试将变得不可靠。参考