【问题标题】:AJAX and returns (async related) [duplicate]AJAX 和返回(异步相关)[重复]
【发布时间】:2014-05-25 01:48:33
【问题描述】:

我的代码如下:

function DBManager() {

    this.getContactsList = function() {
        $.post('/post/getContactsList', function (contacts) {
            return contacts;
        });
    }
}

var DBManager = new DBManager();

console.log(FF_DBManager.getContactsList());

但我收到的是undefined,而不是看到帖子回复的结果。

【问题讨论】:

  • 你做过研究吗?这是一个非常基本的问题。
  • 深思:你有三个函数,其中一个返回contacts(当你说return contacts时)? (提示:不是getContactsList。)
  • 我现在正在继续我的研究。还没找到好方法。希望这个答案可以帮助其他人稍后快速找到答案。
  • 右边有dozensofrelated问题。
  • getContactList函数没有返回返回值,当然是未定义

标签: javascript jquery asynchronous


【解决方案1】:

我喜欢在这些情况下使用的示例。

同步函数是这样工作的。你告诉你的妻子你要出去购物,递给她一张白纸,告诉她写下她要你买的东西。你等她写下来,然后去商店。

异步函数是这样工作的。你告诉你的妻子你要出去买东西,递给她一张白纸,让她写下她要你买的东西,等她买完后,把纸给你,然后告诉她你去商店;你会等待她的指示。然后你就忘掉它,开始阅读你的晚报。

在不了解您所做的事情的情况下使用异步函数,就像您在原始帖子中所做的那样,您做了这样的事情。你告诉你的妻子你要出去买东西,递给她一张白纸,让她写下她要你买的东西,等她买完后,把纸给你,然后告诉她你去商店。然后你立即去商店,当你在你身上找不到你妻子的纸时会感到困惑。你回家,继续阅读晚报。然后你的妻子给你她的清单并试图告诉你去商店,但你不理她,认为你的工作已经完成。

【讨论】:

  • 这是一个很好的类比 :) 谢谢
【解决方案2】:

当您进行函数调用时,该函数会依次发出 ajax 请求,这基本上是一个异步请求。此时返回的是undefined,但是一旦ajax调用完成,就会返回正确的值。

function DBManager() {

    this.getContactsList = function() {
        $.post('/post/getContactsList', function (contacts) {
            console.log(contacts);
            return contacts;
        });
    }
}

var FF_DBManager = new DBManager();

console.log(FF_DBManager.getContactsList());

可以尝试在回调方法中添加console.log(contacts);,看看基本返回了什么。

否则,如果您真的想使用 ajax 并等待返回,那么您可以尝试使 ajax 调用 同步 而不是 异步

$.ajax 的简单示例

$.ajax({
  type: 'POST',
  url: url,
  data: data,
  success: success,
  dataType: dataType,
  async:false
});

【讨论】:

    【解决方案3】:

    因为contacts的值只有在ajax调用完成后才可用。因此,您需要通过处理 ajax 结果的回调函数来完成。喜欢

    function DBManager() {
    
        this.getContactsList = function(cb) {
            $.post('/post/getContactsList', function (contacts) {
                cb(contacts);
            });
        }
    }
    
    FF_DBManager.getContactsList(function(data){
    
        console.log(data);
    
    });
    

    【讨论】:

    • 谢谢,所以我认为在这些函数中返回不是最佳的?我应该有类似var contacts; DBManager.getContactsList(function (data) { contacts = data; });?
    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 2019-02-06
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多