我想保存所有部分,对刚刚保存的部分的ID进行更新,然后保存问题,然后如果成功则触发重定向页面的函数nextPage。我想确认这是正确的。如果我没有围绕saveAllQuestions的匿名函数,那似乎很有趣。
saveAllSections(function () {saveAllQuestions(nextPage)});
更新
关于saveAllSections的成功,它执行以下操作:
if (typeof(callback) == 'function')
callback();
关于saveAllQuestions的成功,它执行以下操作:
if (questionValuesToSave.length>0) {
saveAllQuestionValues(questionValuesToSave, callback);
}
else {
// once its done hide AJAX saving modal
hideModal();
if (typeof(callback) == 'function')
callback();
}
关于saveAllQuestionValues的成功(假设有一些),它执行以下操作:
if (typeof(callback) == 'function')
callback();
答案 0 :(得分:2)
是的,这对于回调来说通常是正确的语法,但是如果没有看到更多的代码就很难确定。
以下代码
saveAllSections(saveAllQuestions(nextPage));
会失败,因为saveAllQuestions(nextPage)
是执行函数的语法,而不是定义它。因此它会立即执行该操作并将结果传递给saveAllSections
,它将尝试将其用作回调。由于这可能不是一个函数,并且几乎肯定不是你想要传递的函数,你会得到奇怪的行为,很可能是一个错误。
将此函数包装在匿名函数中意味着您将函数传递给saveAllSections
,该函数在外部函数调用或作为回调函数之前不会执行。
看起来saveAllQuestions也是基于您的描述的异步,因此立即执行它肯定无法正常工作。如果你需要传递一个参数,匿名函数包装器是一个完全可以接受的解决方案。
如果你没有,你可以使用
saveAllSections(saveAllQuestions)
答案 1 :(得分:1)
在javascript中,您可以将函数作为参数传递。这允许更简单的代码和异步回调。在您的尝试中,您不会传入函数。您执行函数,因此saveAllQuestions(nextPage)
的结果将传递给函数,而不是函数saveAllQuestions
。< / p>
希望这个例子有所帮助。
function add(a,b) {
return a+b;
}
function mul(a,b) {
return a*b;
}
function doMath(num1, num2, op) {
return op(num1, num2);
}
document.write( doMath(4,5, add) ); // 9
document.write( doMath(4,5, function (n1,n2) {return n1+n2;}) ); // 9
document.write( doMath(2,5, mul) ); // 10
document.write( doMath(2,5, function (n1,n2) {return n1*n2;}) ); // 10
document.write( doMath( doMath(1,3, add) , 4, mul) ); // 16
答案 2 :(得分:1)
您需要在匿名函数中包装saveAllQuestions
的原因是因为否则saveAllQuestions
会立即执行,并且其返回值将作为回调传递给saveAllSections
。
如果将saveAllQuestions
包装在匿名函数中,则会阻止saveAllQuestions
立即执行。