【问题标题】:Variable scope issue on returning value from $.post从 $.post 返回值的变量范围问题
【发布时间】:2011-10-24 22:51:23
【问题描述】:

我遇到了 $.post 的变量范围问题之一。在提交表单之前,我想先检查用户是否编辑了内容。如果用户没有,我返回 false。

我在 Stackoverflow 上查看了一堆不同的示例,执行此操作的一般方法是在该函数内创建一个函数和一个回调函数来处理回调。我的问题是,当我在下面调用 getReturned 时,回调没有实现(知道这一点,因为表单被提交并且我已经尝试了警报)。顺便说一句,alert("No changes were made so text was not submitted."); 被成功调用。

我做错了什么?

function getReturn(callback, id, old_variable){
    var return_value = "ERROR";
    $.post('myURL', {"id" : id},
       function(data) {
          var text_from_server = $.trim(data[0].note_text);
          if (old_variable == text_from_server){
             alert("No changes were made so text was not submitted.");
             return_value = false;
             callback(return_value);
          } else {
            return_value = true;
            callback(return_value);
          }
        },
        "json"
     );
    };
var id = 123;
var old_variable = "foo";
getReturn(
       function(return_value){return return_value;/*alert("SUCCESS!");*/}, 
       id, 
       old_variable
);

【问题讨论】:

  • 你在callback里面测试alert的时候,return语句之前有alert吗? @Ariel 似乎是对的,但仍应调用回调。

标签: javascript jquery ajax scope


【解决方案1】:

由于您正在发出异步请求以测试值是否已更改,因此您必须始终从提交处理程序返回 false。在回调中,如果表单被编辑,您将使用form.submit() 手动提交表单。像这样的:

getReturn(   
    function(return_value) {
        if (return_value) {
            $("#myForm").submit();
        }
    },    
    id,    
    old_variable);
return false;

【讨论】:

    【解决方案2】:

    你不懂异步执行。你不能从 $post 中返回任何东西!不要忘记这一点。你所能做的就是触发某些事情的执行——你可以尝试设置一个变量标志,但这对你没有帮助。您还需要触发一个函数的执行,该函数使用该标志执行某些操作,并且您必须从 $post 内部调用该函数。

    作为回调发送的函数返回一个值。但它不会将值返回到任何地方。你在 $post 中调用它,它在 $post 中返回值——这对你没有任何用处,因为你没有对返回值做任何事情。

    我会告诉你如何改变它,除非你没有说你想用这个返回值做什么。

    【讨论】:

    • 谢谢@Ariel。如果old_variable == text_from_server 为真,我想返回假,这样表单就不会提交。
    • 但是你已经提交了表格 - 否则你怎么有text_from_server
    猜你喜欢
    • 2020-07-24
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2016-08-30
    • 2011-11-21
    • 2011-04-13
    相关资源
    最近更新 更多