【问题标题】:JavaScript - function doesn't return good value [duplicate]JavaScript - 函数没有返回好的值[重复]
【发布时间】:2012-09-27 14:55:27
【问题描述】:

可能重复:
How can I return a value from an AJAX request?

我编写了从 .php 文件中获取用户名的函数

function pobierzLogin()
{
  var myVar= "0";
  $.post("logowanie.php", { "logowanie" : 3 }, function(odp)
  {
    myVar = odp;
  });
  return myVar;
}

myVar 将返回 0,但 alert(odp);效果不错。

【问题讨论】:

标签: javascript jquery function return


【解决方案1】:

这应该可以正常工作。

function pobierzLogin()
{
    var myVar= "0";
    return $.post("logowanie.php", { "logowanie" : 3 }, function(odp)
    {
        return odp;
    });
}

我经常使用这个,每次都成功。

更新

在@user1689607 的帮助下,这应该是

function pobierzLogin()
{
    return $.ajax({
        url : "logowanie.php",
        type : "post",
        dataType: "json", 
        data: {
            "logowanie": 3
        }
    })
}

pobierzLogin().done(function(odp){
   //... do stuff
});

【讨论】:

  • 你期望pobierzLogin()返回什么?
  • odp... 从 $.post 回调返回。
  • 这是不正确的。 $.post 是异步的,永远不会返回其回调的返回值。
  • 如果你期望给回调的值将从pobierzLogin()返回,那么我的解释是你从来没有让它工作过。它可以工作,但只能利用 $.post 返回 Deferred 对象这一事实。
  • 完美,你总能学到新东西。谢谢!
【解决方案2】:

Ajax 是异步的。因此,您的函数在为其赋值之前会返回变量。这样做:

function pobierzLogin(callback)
{
  var myVar= "0";
  $.post("logowanie.php", { "logowanie" : 3 }, function(odp)
  {
    callback(odp);
  });
}

然后像这样使用它:

pobierzLogin(function(odp){
      //do smthing with odp
});

编辑:

你可以在 ajax 参数中设置 async: false,此时 ajax 调用将是同步的:

return $.ajax({
    url : "logowanie.php",
    type : "post",
    dataType: "json", 
    async: false,
    data: {
        "logowanie": 3
    }
})

【讨论】:

    【解决方案3】:

    这是因为您的请求是异步发生的,所以直到 after pobierzLogin 方法完成后才会设置该值,因为请求需要时间才能发送到上网并返回。

    不要做你正在做的事情,而是定义一些你想在请求返回时触发的其他方法,并在你的回调中执行它到$.post。

    var whenRequestReturns = function(args){ ...  }
    
    $.post("logowanie.php", { "logowanie" : 3 }, function(odp)
      {
        whenRequestReturns(); // invoke here
      });
    

    或者只是做类似的事情

    $.post("logowanie.php", { "logowanie" : 3 }, whenRequestReturns)

    【讨论】:

      【解决方案4】:

      您的alert(odp); 必须在帖子的回调中,因为$.post 是asynchronous。

      修改代码:

      function pobierzLogin(cb)
      {
        var myVar= "0";
        $.post("logowanie.php", { "logowanie" : 3 }, function(odp)
        {
           myVar = odp;
            cb(odp):
         });
         return myVar;
       }
       pobierzLogin(function(myVar ){
         alert(myVar );
      });
      

      【讨论】:

        猜你喜欢
        • 2021-07-02
        • 2019-02-16
        • 1970-01-01
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        相关资源
        最近更新 更多