【发布时间】:2016-01-15 20:58:43
【问题描述】:
对 javascript 有点陌生,但根据我的阅读,promise 中的所有值基本上只能在该 promise 中使用,对吧?
基本上 getSomething() 从另一个承诺返回真/假。如果为真,我将跳出 for 循环。我试过这样的东西,但我确定它不正确,因为它没有打印出“打破”
for(...) {
var bool = this.getSomething(a,b,c).then((flag) => {
if (flag == true) {
console.log('returning true');
return true; // can't use break so have to set boolean - eslint gives me unsyntactical break
}
});
if (bool == true) {
console.log('breaking');
break;
}
}
getSomething(a,b,c) {
const n = b[a].element(by.binding('something'));
return n.getText().then((text) => {
if (text === c) {
return clickSomething(); // returns true after click()
}
});
}
我之所以使用for循环是因为我需要在strong标签中找到匹配的文本,然后点击它下面td标签中的按钮。
<tbody>
<tr ng-repeat="something">
<td>
<strong>{{x.name}}</strong>
</td>
<td>
<button>{{x.button}}</button>
</td>
</tr>
</tbody>
【问题讨论】:
-
你不能在 for 循环中使用 Promise。 Promise 是异步的,这意味着它们只会在所有其他同步代码运行之后才会运行。
-
@MikeC 为什么之后?它们将同时运行。
-
@Calin 我的意思是
.then函数在所有同步代码完成之前不会执行。与使用setTimeout或setInterval的想法相同。 -
@MikeC 然后会返回一个新的promise,回调函数(它有一个语法错误)一旦有人在这个promise上调用resolve就会被执行,没有人在这段代码中这样做。我认为发帖人需要对承诺做更多的阅读。
-
@Calin
then回调很好。这是一个arrow function。是的,它会返回一个承诺,这明确意味着该值将无法及时访问到break循环之外。请参阅 alecxe 的回答。
标签: javascript angularjs protractor