2011-04-30 36 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