【问题标题】:How to return the proper data from this function?如何从此函数返回正确的数据?
【发布时间】:2011-08-16 02:21:00
【问题描述】:
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);

并让它返回该 userData 对象。

【问题讨论】:

  • 你试过了吗?任何调试尝试?您发布的代码现在会发生什么?我没有看到任何明显的错误,所以这将有助于获得更多细节
  • 你误解了异步编程的本质。该函数返回时没有数据。稍后当调用返回数据变为时执行回调。

标签: javascript node.js


【解决方案1】:

你没有。

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.
});

【讨论】:

  • @float 有一个选项可以进行同步 ajax 调用,但这真的很糟糕。应该不惜一切代价避免这种情况,在所有情况下都最好传递回调或承诺。同步 ajax 仅在处理大型代码库时才可行,并且重构不具有成本效益。
  • 我遇到了一个奇怪的错误:userData.name should = "THE CORRECT NAME" .../server.js:470 sys.puts('userData.name should = '+JSON.stringify(data[0].name)); ^ TypeError: Cannot read property 'name' of undefined
  • 系统将正确的值放在控制台中,但随后也会抛出未定义的错误 - 有什么想法吗?
  • @float 抱歉,您不能使用 userData 我没有删除它。您需要在回调函数中访问userData。再看看这个例子。
猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2022-10-07
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多