Jquery 在ajax调用的结果出现后,如何返回函数的值?

Jquery 在ajax调用的结果出现后,如何返回函数的值?,jquery,html,ajax,Jquery,Html,Ajax,有点像这样: function getfoo() { var foo = ""; $.get("foofile.html", function (data) { foo = data; }); return foo; } 但是,由于脚本是异步的,它将返回。这显然不是我想要的 于是我尝试了这个: function getfoo() { var foo = ""; $.get("foofile.html", function (data) { foo = d

有点像这样:

function getfoo() {
  var foo = "";
  $.get("foofile.html", function (data) {
    foo = data;
  });
  return foo;
}
但是,由于脚本是异步的,它将返回。这显然不是我想要的

于是我尝试了这个:

function getfoo() {
  var foo = "";
  $.get("foofile.html", function (data) {
    foo = data;
  });
  for (;;) {
    if (foo != "") {
      return foo;
      break;
    }
  }
}

我原以为这会起作用,但事实并非如此。为什么不呢?有人能提出解决方案吗?

您应该使用回调传递函数,让它处理您的数据

function getfoo(callback) {
  var foo = "";
  $.get("foofile.html", function (data) {
    callback(data);
    // do some other things
    // ...
  });
}

getfoo(function(data) {
   console.log(data);
});

ajax的第一个a代表异步,因此您试图做的有点违背ajax的哲学。但是,可以使用阻塞请求,但.get simplified接口不支持此操作,并且必须使用.ajax函数:

var foo = "hmmm";
$.ajax("jquery.js", {async:false, success:function(x){foo=x}});
alert(foo);
javascript的基本执行模型是基于事件的单线程web worker提供多线程功能,但每个worker都生活在自己的地址空间中,不能与其他worker或主线程共享任何内存。。。所以在某种意义上,它们更类似于进程而不是线程

在Javascript中,您不能在循环中等待其他事情发生,函数必须总是快速终止,可能会附加回调,以便在发生事情时再次调用。如果你做了一个循环,javascript引擎就会被卡在这个循环中,如果javascript中可以看到的话,就不允许进行其他处理。例如:

// Warning: WRONG example... this won't work!
var foo = 0;
setTimeout(function(){foo = 1}, 100); // Set foo=1 after 100ms
while (foo == 0) ; // Wait for that to happen
alert(foo);
将不起作用,因为在主代码路径结束之前,不允许浏览器引擎执行超时回调中的其他javascript代码

这种基于事件的方法大大简化了编程,因为不需要锁定。。。总是只有一个线程在操纵状态,但是对于长时间的操作,强制使用不同的流设计

只有一个执行线程这一事实也意味着,当javascript代码执行任何长时间的计算时,其他所有内容都会被阻止,并且浏览器看起来对用户没有响应


这种无响应性就是为什么使用同步调用来检索资源被认为是一种不好的做法。。。浏览器已经实现了从多个流中并发获取不同资源的困难工作,但是您的javascript代码需要使用回调模型才能利用此功能。

使用ajax时,您的代码应该有点不同。您应该将调用者和被调用者逻辑分开

假设您现有的代码如下

function getfoo() {
  var foo = "";
  $.get("foofile.html", function (data) {
    foo = data;
  });
  return foo;
}

function usefoo(){
  var data = getfoo();
  // do something with data
}
它应该写得像

function getfoo() {
  var foo = "";
  $.get("foofile.html", function (data) {
    usefoo(data);
  });
}

function usefoo(data){
  // do something with data
}

那么,如果我想从getfoo函数内部返回值,我该怎么办?我将无法从GET函数内部使用return,对吗?@think123如果需要,请使用.ajax方法并将async设置为false,但不建议这样做。非常感谢。这真的很有帮助。@think123:添加了.ajax示例。在我看来,从您的问题来看,您似乎不了解基本的javascript执行模型—无共享内存并发。