使用变量与ajax范围-关闭?回调

use variable with ajax scope - closure? callback?

本文关键字:关闭 回调 范围 ajax 变量      更新时间:2023-09-26

ajax()函数中使用变量有一些困难。我知道这是因为变量不在ajax()调用的范围内,但不确定如何解决这个问题。我读过一些关于闭包和回调的内容,但不确定如何将其应用到我的代码中。

代码总结:在click()上,我通过ajax获得user_notes,并且在成功的情况下,我弹出一个显示user_notes的对话框(到目前为止所有这些都有效)。它崩溃的地方是当我然后尝试做另一个ajax调用时,"保存"按钮被按下。在第二个ajax调用中,user_notes在该范围内是未定义的。

我如何在第二个ajax调用中使用user_notes ?

 $(".editSaved").click(function() {
            save_id = $(this).attr('id');
            var user_notes;
            //GET USER NOTES
            $.ajax ({
                url:"journal-util.php",
                data:"q=0&f=user_notes&save_id="+save_id,
                success: function(user_notes){
                    //BUILD SAVE DIALOG
                    div="<div><textarea rows=15 cols=27 id='RowSave'>"+user_notes+"</textarea></div>";
//AT THIS POINT USER_NOTES HAS A VALUE
                    success="<div>Updated!</div>";
                    $(div).dialog({ 
                        buttons: { 
                            "Save": function() { 
                                var that = this;
                                var un = user_notes; //tried this, didn't work
                                $.ajax ({
                                    url:"journal-util.php",
                                    data:"q=0&f=update&user_notes="+un, //un is empty
                                    success: function(result){
                                        alert(result);
                                        $(that).dialog("close");
                                        //$(success).dialog();
                                    }
                                })
                            },
                            "Cancel": function() { 
                                $(this).dialog("close");
                            } 
                        },
                        modal: true,
                        title: 'Delete',
                        resizable: false
                    });
                }
            });
        });

为什么不行

代码不工作的问题是,当第二个AJAX成功回调函数被触发时,user_notes保存的值可能已经被更改或重置。要使其工作,您需要捕获该作用域中user_notes

解决方案

用闭包替换你的"Save"回调函数以保存该范围内的user_notes

"Save": function (un) {
          return function() {
                    var that = this;
                    $.ajax ({
                        url:"journal-util.php",
                        data:"q=0&f=update&user_notes="+un, 
                        success: function(result){
                            alert(result);
                            $(that).dialog("close");
                            //$(success).dialog();
                        }
                    });
                };
          } (user_notes),

试试这个方案

un = $('#RowSave').val();

希望这能解决你的问题

您知道您有两个user_notes声明吗?在click方法内部使用var,在第一个ajax中再次使用var作为参数。第一个方法保持未定义,第二个方法只有在使用已定义的参数调用成功方法时才会定义。

在嵌套作用域中重新定义名称时要小心,这会引起混淆。

先修改它,然后如果success方法的parameter值是你想要的,你应该显式地将它保存到一个变量中。

(我个人不会写嵌套代码。我可能会使用带有变量的对象来存储数据和that=this引用,并在ajax成功和失败上使用瘦内联函数包装器,仅调用对象成员方法。我喜欢避免深度嵌套作用域,也不喜欢水平滚动;)