【问题标题】:How can I pass the enclosing function as its own recursive callback in Javascript?如何在 Javascript 中将封闭函数作为其自己的递归回调传递?
【发布时间】:2011-02-15 16:18:59
【问题描述】:

我正在为一组应用程序设计一个 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);

【问题讨论】:

    标签: javascript ajax callback closures


    【解决方案1】:

    给它一个名字。在上面的例子中,你在里面叫它onSaveCallback。只需将该名称用于外部函数,并将其称为onSaveCallbackarguments.callee 应该也可以工作,如果你不能给它一个名字。

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

    【讨论】:

    • 效果很好——谢谢!我以为我以前尝试过,但我可能以一种过于复杂的方式失败了。此外,现在我将回调包装在单个对象中以简化代码,这实际上使这看起来更好。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多