2009-11-23 34 views
2

这里是get.json的内容:对象返回需要等到JSON请求完成

{ “ID”:1, “名”: “你好”}

和脚本/标记:

var entries = [];

 function Data(){} 
     Data.prototype.get = function(id){ 
      var object = {}, length = entries.length, success = false; 
      for (var i = 0; i < length; i++) { 
       if (entries[i].id == id) { 
        object = entries[i]; 
        i = length; 
        console.log("From browser: " + object.name); 
        success = true; 
       } 
      } 
      if (!success) { 
       $.getJSON("get.json", function(data){ 
        entries.push(data); 
        object = data; 
        console.log("Newly fetched: " + object.name); 
       }); 
      } 
      return object; 
     } 

     $(function(){ 
      var data = new Data(); 
      data.get(1); 
      console.log((data.get(1).name); 
     }); 

回答

1

我会使用回调。如果数据存在于浏览器缓存中,则回调将立即触发。如果不是,则在异步请求结束时它将被触发。

function Data(){} 
Data.prototype.get = function(id, callback){ 
    var object = {}, length = entries.length, false; 
    for (var i = 0; i < length; i++) { 
     if (entries[i].id == id) { 
      object = entries[i]; 
      console.log("From browser: " + object.name); 
      callback(object); 
      return; // Don't let execution continue 
     } 
    } 

    $.getJSON("get.json", function(data){ 
     entries.push(data); 
     object = data; 
     console.log("Newly fetched: " + object.name); 
     callback(object); 
    }); 
} 

$(function(){ 
    var data = new Data(); 
    data.get(1, function(obj){ 
     console.log(obj.name); 
    }); 
}); 

另一种方式是让你的AJAX调用同步这将暂停所有执行,但是这是一个非常坏主意

编辑:我也改变你的代码一点点去除success变量,并选择从for循环权限返回(从而打破循环)。

+0

没问题。异步思考是思维的一个重大转变。每次我使用它的项目时,我都必须停下来想一想! – 2009-11-23 05:08:50