如何在Javascript中将封闭函数作为自己的递归回调传递?

时间:2011-02-15 16:19:00

标签: javascript ajax callback closures

我正在为一组应用程序设计一个AJAXy表单生成Javascript库,其中回调行为应根据应用程序而有所不同。我正在公开的API函数采用一组回调,将功能附加到标准表单中出现的各种按钮和其他事件:

  • onLoadCallback [表单完全加载时]
  • onSaveCallback [成功处理保存时]
  • onCancelCallback [点击取消按钮时]
  • busyCallback [每当AJAX操作正在进行时]
  • readyCallback [当AJAX操作完成时]

例如,一个应用程序想要在新弹出窗口中呈现此窗体,而另一个应用程序希望它在现有页面中内联。在弹出场景中,onSaveCallback将关闭弹出窗口并将消息发布到启动页面。在内联方案中,onSaveCallback应该通过重新运行该函数来重新加载表单内容。

是否有一种标准的,更简单的方法来执行递归回调,而不是两次写函数,如下所示?

MyFormLibrary.displayForm(
  div, 
  formName, 
  query,
  onLoadCallback,
  function onSaveCallback(result) {
      MyFormLibrary.displayForm(
         div,
         formName,
         query,
         onLoadCallback,
         onSaveCallback,
         onCancelCallback,
         busyCallback,
         readyCallback);
  },
  onCancelCallback,
  busyCallback,
  readyCallback);

2 个答案:

答案 0 :(得分:2)

给它起个名字。在上面的例子中,你在里面称它为onSaveCallback。只需将该名称用于外部函数,并将其称为onSaveCallback。如果有理由不能给它起个名字,那么arguments.callee也应该有效。

MyFormLibrary.displayForm(
  div, 
  formName, 
  query,
  onLoadCallback,
  arguments.callee,
  onCancelCallback,
  busyCallback,
  readyCallback);

答案 1 :(得分:0)

将你的电话放在一个函数中,这样你就可以递归调用它:

function recursiveSaveCallback (result) {
    MyFormLibrary.displayForm(
        div, 
        formName, 
        query,
        onLoadCallback,
        recursiveSaveCallback,
        onCancelCallback,
        busyCallback,
        readyCallback
    );
}

recursiveSaveCallback(result);