我需要像while()那样的重复块,它在执行之前验证条件。我的代码在下面,但是while不起作用......
if (j == 0)
{
printf("|%d",i); //you want to print i here, not j
}
printf("| "); //put the blank printing after the number
如何更换while,但仍然需要相同的结果?
答案 0 :(得分:2)
我至少部分同意alecxe。一些"等待"订单应该解决。我只是想解释一下我的想法,希望它对你有用......因为我花了很多时间在这类问题上^^。
对我而言,最重要的是Protractor以异步方式运行所有内容。
当您运行测试时,Protractor基本上可以运行代码的每个部分,即直到遇到承诺。当遇到承诺时,量角器可以做两件事,这取决于你是否设置了browser.ignoreSynchronization = true;
(这是我的情况)
browser.waitForAngular
。但是,您当然可以在代码中添加明确的等待命令,在某些情况下您可能希望这样做以获得更稳定的代码。如果您想了解更多相关信息,请阅读this post
var foundPersonen = true;
while (foundPersonen){
detailPage.getAllPersonen().then(function(value) {
if (value.length == 0) {
foundPersonen = true;
remoteControl(Keys.HK_BACK);
remoteControl(Keys.HK_P_up);
remoteControl(Keys.HK_INFO, 1, 3000);
}
else {
foundPersonen = false;
}
}
就我而言(browser.ignoreSynchronization = true;
),会发生以下情况:
如果是1
创建一个帖子。在这个线程中,创建一个promise并等待它被解析,然后用promise的值做一些事情
在主线程中,返回第2步
这种解释导致了一个简单的预测。由于将布尔值设置为0的代码在之后处理处理了承诺,因此这段代码将尽可能快地创建承诺,直到其中一个承诺得到解决并将布尔值设置为false 。
结果呢?在解决第一个承诺之前,您的代码将达到最大内存。 - >您将收到一些与内存分配相关的异常。
我用这段代码测试过:
return scenariiSteps.AtlasLogin("my", "credentials")
.then(function () {
var foundDialogs = element.all(by.xpath("//div[@dialog-id]"));
var foundDialogsZero = true;
while (foundDialogs) {
foundDialogs.count().then(function (value) {
if (value == 0) {
foundDialogsZero = true;
console.log("0, man")
}
else {
console.log("Found something!")
foundDialogsZero = false;
}
});
}
});
此代码的作用是
如果是1
创建承诺并等待其解决,然后使用承诺的价值做一些事情
返回第4步
并且,为了确保我的解释,请注意我的应用程序在用户登录后包含2个对话框。
我想,我收到了FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
"好的,谢谢你的长篇解释,但是......我现在应该怎么做?"
基本上你必须告诉Protractor在执行你想要的动作之前等待某些条件。最好的方法取决于您的要求和您的环境。例如,我不认为alecxe的解决方案可以解决我环境中的问题。
如果您需要更多帮助,了解更多关于您想要做的事情会很有用。
答案 1 :(得分:1)
是的,因为量角器继续将所有内容添加到控制流中,所以像这样的块不能按预期工作。尝试在函数中递归调用它。
function keepChecking(){
while (foundPersonen) {
detailPage.getAllPersonen().then(function(value) {
if (value.length == 0) {
foundPersonen = true;
remoteControl(Keys.HK_BACK);
remoteControl(Keys.HK_P_up);
remoteControl(Keys.HK_INFO, 1, 3000);
keepchecking();
}
else {
foundPersonen = false;
}
});
}
}
keepchecking();
答案 2 :(得分:0)
我认为您可以使用browser.wait()
解决问题:
browser.wait(function () {
return detailPage.getAllPersonen().count().then(function (count) {
if (count == 0) {
remoteControl(Keys.HK_BACK);
remoteControl(Keys.HK_P_up);
remoteControl(Keys.HK_INFO, 1, 3000);
return false;
}
else {
return true;
}
}
}, 10000);
当计数为0时,这将执行条件功能最多10秒。如果为0,则执行远程控制功能。请测试。