0

我想保存所有部分,用刚刚保存的部分的 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();
4

3 回答 3

2

是的,这通常是回调的正确语法,尽管如果不查看更多代码就很难确定。

以下代码

saveAllSections(saveAllQuestions(nextPage));

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

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

更新:

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

如果你没有,你可以使用

saveAllSections(saveAllQuestions)
于 2013-08-07T20:21:02.993 回答
1

在 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
于 2013-08-07T20:29:48.453 回答
1

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

如果你包装saveAllQuestions一个匿名函数,你会阻止saveAllQuestions立即执行。

于 2013-08-07T20:30:09.787 回答