这是对我检查照片来源是否存在的网站的测试,如果他们不想隐藏显示这些照片的额外面板(如果存在的话)。问题是我无法让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";
}
}
答案 0 :(得分:2)
$.get
是异步的。在调用done
或fail
函数之前,循环已完成。
当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
本身已经全局。