Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中将封闭函数作为其自己的递归回调传递?_Javascript_Ajax_Callback_Closures - Fatal编程技术网

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

如何在Javascript中将封闭函数作为其自己的递归回调传递?,javascript,ajax,callback,closures,Javascript,Ajax,Callback,Closures,我正在为一组应用程序设计一个AJAXy表单生成Javascript库,其中回调行为应根据应用程序的不同而有所不同。我公开的API函数采用一组回调,将功能附加到各种按钮和标准表单中发生的其他事件: onLoadCallback[表单完全加载时] onSaveCallback[成功处理保存时] onCancelCallback[单击取消按钮时] busyCallback[每当AJAX操作正在进行时] readyCallback[当AJAX操作完成时] 例如,一个应用程序希望在新的弹出窗口中呈现此

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

给它起个名字。在上面的例子中,您将其称为
onSaveCallback
inside。只需将该名称用于外部函数,并将其称为
onSaveCallback
<代码>参数。被调用方如果有无法为其命名的原因,也应该可以使用

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

将调用放在函数中,以便可以递归调用它:

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

recursiveSaveCallback(result);
真是太棒了,谢谢!我想我以前试过,但我可能做得太复杂了,失败了。另外,现在我将回调封装在一个对象中以简化代码,这实际上使它看起来更好。