javascript - 变量拒绝在 jQuery.get 回调函数中取值

标签 javascript jquery variables asynchronous

我正在检测一个值是否已存储在 localStorage 中(如果 localStorage 存在),如果它不在数据库中(或者用户没有带有 localStorage 的浏览器),那么我运行一个 AJAX GET 请求。

if (Modernizr.localstorage) {
    // there is storage
    artist = localStorage.getItem('artist');
    if (!artist) {
        // but no cache
        artist = fetchArtist();
        localStorage.setItem('artist', artist)
    }
} else {
    // there's no storage
    artist = fetchArtist();
}
function fetchArtist() {
    var fetchedArtist;
    var recentTracks;
    $.get('script.php', [], function(data) {
        recentTracks = data.recenttracks;
        fetchedArtist = ((recentTracks !== undefined) ? recentTracks.track.artist['#text'] : 'Last.fm connection failed.');
    }, 'json');
    return fetchedArtist;
}

script.php 只是获取一个 JSON 字符串,jQuery 将其转换为数据对象。我可以看到问题所在:因为 $.get 是异步的,所以在函数可以分配我之后的值之前返回 fetchedArtist 变量,但我想不出一个整洁的方法来做到这一点(也许是全局变量,但我真的宁愿不)。我可以控制台记录 fetchedArtist var inside $.get 和我想要的值,但 fetchArtist 函数总是返回未定义。

最佳答案

您必须通过从 fetchArtist() 函数中删除 return 语句来异步化您的工作流程,因为由于 $.get 的异步行为,它无法执行您需要的操作> 请求。

尝试这样的事情:


if (Modernizr.localstorage) {
    // there is storage
    var artist = localStorage.getItem('artist');
    if (!artist) {
        // but no cache
        fetchArtist();
    } else {
        doWhatYouNeedWithArtist( artist );
    }
} else {
    // there's no storage
    fetchArtist();
}

function fetchArtist() {
    var fetchedArtist;
    var recentTracks;
    $.get('script.php', [], function(data) {
        recentTracks = data.recenttracks;
        fetchedArtist = ((recentTracks !== undefined) ? recentTracks.track.artist['#text'] : 'Last.fm connection failed.');
        if ( Modernizr.localstorage ) {
                Modernizr.localstorage.setItem('artist', fetchedArtist);
        }
        // then do your stuff
        doWhatYouNeedWithArtist( fetchedArtist );
    }, 'json');
}

function doWhatYouNeedWithArtist( artists ) {
    // do stuff
}

希望对您有所帮助!再见。

关于javascript - 变量拒绝在 jQuery.get 回调函数中取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4845705/

相关文章:

javascript - jQuery、insertBefore、验证、错误消息的放置

javascript - 如何在 JavaScript 中调用 onclick 事件?我不想在 HTML 页面中使用任何事件

jquery - jquery ajax跨域xml响应问题

variables - 在 prolog 中设置变量的并集

string - 批处理文件 : How to get variable's value using variable's name already stored in a string

javascript - 具有 "this"变量的抽象

javascript - JQuery 和 Twitter Bootstrap "button"插件 - 选择值

string - Python连接一个字符串和一个变量

javascript - jsTree : how can i search with id in jsTree?

jQuery 自动完成自定义数据并显示除标签、值之外的内容