2011-04-30 61 views
2
function getUserData(name) { 
var userData = {}; 
twitter.get('http://api.twitter.com/1/users/lookup.json', {screen_name:name}, function(data) { 
    userData = { 
     name: data[0].screen_name, 
     screenname: data[0].screen_name, 
     id: data[0].id, 
     url: data[0].url, 
     description: data[0].description 
    } 
}); 
return userData; 
} 

我希望能够写类似:如何从该功能返回正确的数据?

var userData = getUserData(name); 

,并使其返回该用户数据对象。

+0

你试过了吗?任何尝试调试?您发布的代码现在会发生什么?我没有看到任何明显的错误,所以这将有助于获得更多的细节 – 2011-04-30 14:55:00

+0

您误解了异步编程的本质。函数返回时没有数据。当数据变为从呼叫返回时稍后执行回调。 – Orbling 2011-04-30 14:57:02

回答

2

你不知道。

AJAX呼叫是异步。您需要以某种方式使用回调。

function getUserData(name, cb) { 
    var userData = {}; 
    twitter.get('http://api.twitter.com/1/users/lookup.json', { 
     screen_name: name 
    }, function(data) { 
     userData = { 
      name: data[0].screen_name, 
      screenname: data[0].screen_name, 
      id: data[0].id, 
      url: data[0].url, 
      description: data[0].description 
     } 
     cb(userData); 
    }); 
} 

getUserData(name, function(userData) { 
    // do stuff. 
}); 

如果您使用jQuery 1.5,您可以使用延迟承诺,它们是jQuery Deferred对象。

function getUserData(name, cb) { 
    var def = new jQuery.Deferred(); 
    twitter.get('http://api.twitter.com/1/users/lookup.json', { 
     screen_name: name 
    }, function(data) { 
     var userData = { 
      name: data[0].screen_name, 
      screenname: data[0].screen_name, 
      id: data[0].id, 
      url: data[0].url, 
      description: data[0].description 
     } 
     def.resolve(userData); 
    }); 
    return def.promise(); 
} 

var promise = getUserData(name); 
promise.done(function(data) { 
    // do stuff. 
}); 
+0

啊,好吧,有道理 - 谢谢 – fancy 2011-04-30 14:58:23

+0

@float有一个选项可以进行同步ajax调用,但这真的很糟糕。应该不惜一切代价避免这种情况,在所有情况下都优先传递回调或承诺。在处理大型代码库时,同步ajax是唯一可行的,而重新分解并不符合成本效益。 – Raynos 2011-04-30 15:04:29

+0

我遇到一个奇怪的错误: 'userData.name应该= “正确名称” .../server.js:470个 \t \t sys.puts( 'userData.name应该=' + JSON .stringify(数据[0]。名称)); ^ TypeError:无法读取未定义的属性“名称” – fancy 2011-04-30 15:27:45