Javascript 这个回调结构正确吗?

Javascript 这个回调结构正确吗?,javascript,callback,Javascript,Callback,我想保存所有部分,用刚刚保存的部分的ID对问题进行更新,然后保存问题,如果成功,则启动一个函数nextPage重定向页面。我想确认这是正确的。如果我没有围绕saveAllQuestions的匿名函数,这看起来很有趣 saveAllSections(function () {saveAllQuestions(nextPage)}); 更新: saveAllSections成功后,它将执行以下操作: if (typeof(callback) == 'function')

我想保存所有部分,用刚刚保存的部分的ID对问题进行更新,然后保存问题,如果成功,则启动一个函数nextPage重定向页面。我想确认这是正确的。如果我没有围绕saveAllQuestions的匿名函数,这看起来很有趣

saveAllSections(function () {saveAllQuestions(nextPage)});
更新:

saveAllSections成功后,它将执行以下操作:

if (typeof(callback) == 'function')
               callback(); 
            if (questionValuesToSave.length>0) {
                saveAllQuestionValues(questionValuesToSave, callback);
            }
            else {
                 // once its done hide AJAX saving modal
                hideModal();
                if (typeof(callback) == 'function')
                    callback();
            } 
                    if (typeof(callback) == 'function')
                        callback();
saveAllQuestions成功后,它将执行以下操作:

if (typeof(callback) == 'function')
               callback(); 
            if (questionValuesToSave.length>0) {
                saveAllQuestionValues(questionValuesToSave, callback);
            }
            else {
                 // once its done hide AJAX saving modal
                hideModal();
                if (typeof(callback) == 'function')
                    callback();
            } 
                    if (typeof(callback) == 'function')
                        callback();
saveAllQuestionValues成功后(假设有一些),它将执行以下操作:

if (typeof(callback) == 'function')
               callback(); 
            if (questionValuesToSave.length>0) {
                saveAllQuestionValues(questionValuesToSave, callback);
            }
            else {
                 // once its done hide AJAX saving modal
                hideModal();
                if (typeof(callback) == 'function')
                    callback();
            } 
                    if (typeof(callback) == 'function')
                        callback();

是的,这通常是回调的正确语法,但如果没有看到更多代码,就很难确定

下面的代码

saveAllSections(saveAllQuestions(nextPage));
将失败,因为
saveAllQuestions(nextPage)
是执行函数的语法,而不是定义函数。因此,它将立即执行该命令,并将结果传递给
saveAllSections
,后者将尝试将其用作回调。因为这很可能不是一个函数,而且几乎肯定不是您想要传递的函数,所以您将得到奇怪的行为,很可能是一个错误

将其包装在匿名函数中意味着将函数传递给
saveAllSections
,该函数在外部函数调用或作为回调调用之前不会执行

更新: 根据您的描述,saveAllQuestions也是异步的,因此立即执行它肯定无法正常工作。如果需要传递参数,匿名函数包装器是完全可以接受的解决方案

如果你没有,你可以用

saveAllSections(saveAllQuestions)

是的,这通常是回调的正确语法,但如果没有看到更多代码,就很难确定

下面的代码

saveAllSections(saveAllQuestions(nextPage));
将失败,因为
saveAllQuestions(nextPage)
是执行函数的语法,而不是定义函数。因此,它将立即执行该命令,并将结果传递给
saveAllSections
,后者将尝试将其用作回调。因为这很可能不是一个函数,而且几乎肯定不是您想要传递的函数,所以您将得到奇怪的行为,很可能是一个错误

将其包装在匿名函数中意味着将函数传递给
saveAllSections
,该函数在外部函数调用或作为回调调用之前不会执行

更新: 根据您的描述,saveAllQuestions也是异步的,因此立即执行它肯定无法正常工作。如果需要传递参数,匿名函数包装器是完全可以接受的解决方案

如果你没有,你可以用

saveAllSections(saveAllQuestions)

在javascript中,可以将函数作为参数传递。这允许更简单的代码和异步回调。在您的尝试中,没有传入函数。您执行一个函数,因此
saveAllQuestions(nextPage)
的结果被传递到函数中,而不是函数
saveAllQuestions

希望这个例子能有所帮助

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

在javascript中,可以将函数作为参数传递。这允许更简单的代码和异步回调。在您的尝试中,没有传入函数。您执行一个函数,因此
saveAllQuestions(nextPage)
的结果被传递到函数中,而不是函数
saveAllQuestions

希望这个例子能有所帮助

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

需要在匿名函数中包装
saveAllQuestions
的原因是,否则会立即执行
saveAllQuestions
,其返回值作为回调传递给
saveAllSections


如果在匿名函数中包装
saveAllQuestions
,则会阻止
saveAllQuestions
立即执行。

在匿名函数中包装
saveAllQuestions
的原因是,否则
saveAllQuestions
会立即执行,其返回值作为回调传递给
saveAllSections


如果将
saveAllQuestions
包装在匿名函数中,则会阻止
saveAllQuestions
立即执行。

看起来可能是正确的,但我们需要查看
saveAllSections
saveAllQuestions
的代码才能真正说出更多。定义“有趣”吗?如果
saveAllSections()
需要一个函数作为参数,那么
saveAllQuestions(下一页)
应该可以正常工作fine@sircapsalot不,它不会,它将执行该代码,然后传递结果。下一页的来源是什么?下一页只是一个窗口。top.location=URL;看起来它可能是正确的,但我们需要查看
saveAllSections
saveAllQuestions
的代码才能真正说得更多。定义“搞笑”吗?如果
saveAllSections()
需要一个函数作为参数,那么
saveAllQuestions(下一页)
应该可以正常工作fine@sircapsalot不,它不会,它将执行该代码,然后传递结果。下一页的来源是什么?下一页只是一个窗口。top.location=URL;无论谁对此投反对票,都应该加上一个解释。我也会很感激的。现在OP添加了代码,仍然在排序,这可能已经过时了,但我不知道为什么我会被否决。编辑:在查看代码后,我支持这个答案。有人能解释一下否决票的原因吗?我没有否决票,这是我假设的情况,我正在寻求确认。无论是谁否决了这一点,都应该补充一个解释。我也会很感激的。现在OP添加了代码,仍然在排序,这可能已经过时了,但我不知道为什么我会被否决。编辑:在查看代码后,我支持这个答案。有人能解释一下否决票吗?我没有否决票,这是我的假设