Недавно у меня был случай, когда код, следующий за обратным вызовом, выполнялся до выполнения обратного вызова из $.ui.popup
. Мое решение состояло в том, чтобы установить переменную перед рукой, называемой pause, установить ее в true, выполнить код $.ui.popup
, а затем получить код, который мне нужно было ждать через некоторый интервал. Пример:
var pause = false;
function something() {
if(edited && renamed) {
pause = true;
$.ui.popup({
//...
doneCallback: function() {
//...
pause = false;
}
//...
});
//...
}
var waitCode = setInterval(function(){
if(!pause) {
//... code I needed to wait on ...
clearInterval(waitCode);
}
},500);
}
return
is a "structured" goto
which many programmers find more acceptable! So:
static int findit(int sum, int* pa, int* pb, int* pc)
{
for (int a = 1; a<sum; a++) {
for (int b = 1; b < sum; b++) {
int c = sum-a-b;
if (a*a+b*b == c*c) {
*pa = a; *pb = b; *pc = c;
return a*b*c;
}
}
return -1;
}
int main() {
int a, b, c;
const int sum = 1000;
int result = findit(sum, &a, &b, &c);
if (result == -1) {
std::cout << "No result!" << std::endl;
return 1;
}
std::cout << "a:" << a << std::endl;
std::cout << "b:" << b << std::endl;
std::cout << "c:" << c << std::endl;
std::cout <<"Result:" << result << std::endl;
return 0;
}
См. этот вопрос о выходе из 2 контуров. Есть гораздо лучшие ответы, чем при использовании goto.
Лучший ответ - поместить второй цикл в функцию и вызвать эту функцию изнутри первого цикла.
код скопирован из ответа mquander
public bool CheckWhatever(int whateverIndex)
{
for(int j = 0; j < height; j++)
{
if(whatever[whateverIndex][j]) return false;
}
return true;
}
public void DoubleLoop()
{
for(int i = 0; i < width; i++)
{
if(!CheckWhatever(i)) break;
}
}
Хотя мне кажется, что использование goto в этом случае не Это не так плохо, как убивать котят. Но это близко.
На мой взгляд, в такой ситуации нормально использовать goto
.
Между прочим, снисходительные проповеди против goto обычно исходят от людей, которые просто повторяют то, что они слышали другие где-то говорят или читают ..
Вы можете объявить bool found = false
вверху, а затем добавить &&! Found
в свои условия цикла for (после a
b
Я не могу придумать лучшей альтернативы. Но одна альтернатива, не использующая goto
, будет модифицировать первый для
-loop:
for (a = 1; a<sum && result == -1; a++){
Затем break
из второго для
- петля. Это будет работать при условии, что результат никогда не будет -1
после того, как второй для
-цикла был прерван break
.