2013-04-06 89 views
22

我想要一个从ajax请求返回值的函数。我想停止JavaScript的执行,直到函数获得它通过ajax异步请求返回的值。 喜欢的东西:从ajax调用请求返回值的函数

function myFunction() { 
    var data; 
    $.ajax({ 
     url: 'url', 
     data: 'data to send', 
     success: function (resp) { 
      data = resp; 
     }, 
     error: function() {} 
    }); // ajax asynchronus request 
    return data; // return data from the ajax request 
} 
+2

AJAX中的第一个A代表什么? – Barmar 2013-04-06 05:17:43

+0

@Barmar Aaardvark! – Ian 2013-04-06 05:18:45

回答

32

您需要注册一个回调函数,这样的事情:

+2

不需要将其存储在'data'中。只要拨打回电 – Ian 2013-04-06 05:22:27

+1

@伊恩仍然比其他的亲属更好:-) – 2013-04-06 05:28:19

+1

@JanDvorak永远不会说它不是:)只是试图帮助改善答案。 – Ian 2013-04-06 05:31:04

2

使用async: false以来的Ajax您的Ajax请求是异步的。

将async设置为false意味着您要调用的语句必须先完成才能调用函数中的下一个语句。如果设置async:true,那么该语句将开始执行,并且将调用下一个语句,而不管异步语句是否已完成。

从jQuery的docs

By default, all requests are sent asynchronously (i.e. this is set to true by default). If you need synchronous requests, set this option to false

+1

你得给出比这更好的解释。虽然这可能有效,但OP可能不会理解,因为他们不了解手头的问题。 – Ian 2013-04-06 05:19:36

3
$.ajax({ 
     url: 'url', 
     data: 'data to send', 
     async: false, 
     success: function (resp) { 
      data = resp; 
     }, 
     error: function() {} 
    }); // ajax synchronus request 
4

你需要做的ASYN =假像:

$.ajax({ 
    async: false, 
    // ... 
    success: function(jsonData) { 
    //Your Logic 
    } 
}); 
+1

这是在你想要同步响应的情况下,当然。 – Pere 2014-06-03 11:47:00

5

Ajax是异步的,这意味着调用了ajax调用,但您的代码仍然像以前一样快乐地运行而不停止。在收到响应之前,Ajax不会停止/暂停执行。你必须添加一个额外的回调函数或类似的东西。

function myFunction() { 
var data; 
$.ajax({ 
    url: 'url', 
    data: 'data to send', 
    async: false, 
    success: function (resp) { 
     data = resp; 
     callback.call(data); 
    }, 
    error: function() {} 
}); // ajax asynchronus request 
return data; // return data from the ajax request 
    } 
+0

您需要将'data'或'resp'实际传递给回调函数。 – Ian 2013-04-06 05:21:47

+0

yes rgt ... .tahnx @lan ....用于重定向我.... :) – 2013-04-06 05:24:27

+1

那么,您可能需要'callback.call(this,data);'因为'call'的第一个参数是用于设置'this'的上下文在函数中。 – Ian 2013-04-06 05:25:38