为什么我不能摆脱这种for循环?

时间:2016-10-24 07:17:23

标签: javascript

这是对我检查照片来源是否存在的网站的测试,如果他们不想隐藏显示这些照片的额外面板(如果存在的话)。问题是我无法让breakVar = true;状态出来并且循环也不会停止,我已经尝试了不同的方法让它在休息/退货时停止。< / p>

我测试了testPhotos(currentProduct,display,breakVar);的输出,我希望得到一个&#34;测试失败&#34;返回所以我可以隐藏额外的面板。

是的,当我拼命试图检查代码执行过程中的状态时,代码变得丑陋了。

我已经尝试将break;语句放在不同的地方,但得到了#34;非法违规声明&#34;错误

我在我的控制台中循环测试失败了8次。

var breakVar = false;

function triggerPhotoFail(breakVar) {
  breakVar = true;
  consol.log('triggerPhotoFail ran');
  return "test-fail";
}
function testPhotos(currentProduct,display,breakVar) {
  for (var i = 0; i < 5; i++) {
    // test if photos exists
    if (breakVar === true) {
      break; // get out of loop
    }
    var src = productArray[currentProduct]['subphoto-' + i];
    $.get(src)
    .done(function() {
      // photo exists
    })
    .fail(function(breakVar) {
      // photo does not exist
      console.log('test failed in loop');
      breakVar = true;
      triggerPhotoFail();
      console.log('breakVar change!: ' + breakVar);
    })
  }
  if (breakVar === true) {
    console.log('breaker var tested true');
    return "test-fail";
  }
  else {
    return "not acknowledged";
  }
}

2 个答案:

答案 0 :(得分:2)

$.get是异步的。在调用donefail函数之前,循环已完成

for函数触发时,你需要用一个先进的迭代器替换done循环。

function testPhotos(currentProduct, display) {
  // This starts the loop
  var i = 0; next();

  function next() {
    // This replaces the regular "end of for loop" check
    if (i == 5) {
      return;
    }

    $.get(src)
      .done(function() {
        // photo exists
        i++; next(); // This does the "End of for loop increment" test and starts the next loop
      })
      .fail(function(breakVar) {
        // photo does not exist
        console.log('test failed in loop');
        triggerPhotoFail();
        // We don't call `next()` here, which breaks the loop
      });

  }
}

答案 1 :(得分:0)

将任何参数传递给triggerPhotoFail()函数,该函数在其定义中需要1个参数,即breakVar。只需删除您的函数定义和调用breakVar)中的所有.fail(function()...参数,因为breakVar本身已经全局