使用JQuery时延迟返回undefined仍然是

时间:2016-08-14 09:30:35

标签: javascript jquery-deferred .when

我刚才使用@Override protected Parcelable onSaveInstanceState() { super.onSaveInstanceState(); Bundle bundle = new Bundle(); bundle.putParcelable("bitmap", customBitmap); return bundle; } @Override protected void onRestoreInstanceState(Parcelable state) { super.onRestoreInstanceState(state); Bundle bundle = new Bundle(); customBitmap = bundle.getParcelable("bitmap"); } $.when,我似乎无法让他们工作

我尝试做的是运行一些功能,当它们全部完成后触发最终功能

以下是我尝试过的几个选项

选项1 - 根据JQuery的文档,按照我的理解,返回$.Deferred()(这是脚本中的一个功能)

d1.getRating is not a function

选项2 - 返回// Set Deferred var d1 = $.Deferred(); // Return movie information if (idResp[0].type === "movie") { // Output Slug traktSlug = 'movies/' + idResp[0].movie.ids.slug; // Output $.when(d1).done(function (ratingValue) { console.log('Rating Is: ' + ratingValue); outputIMDb(showCheckIn, traktSlug, ratingValue); }); // Get Rating d1.getRating(idResp[0].type, idResp[0].movie.ids.trakt); }

ratingValue is undefined

非常感谢任何有关正确方向的建议或推动

完整的源代码可以是viewed on GitHub

更新

我在再次阅读JQuery docs之后意识到// Return movie information if (idResp[0].type === "movie") { // Output Slug traktSlug = 'movies/' + idResp[0].movie.ids.slug; // Output $.when(getRating(idResp[0].type, idResp[0].movie.ids.trakt)).done(function (ratingValue) { console.log('Rating Is: ' + ratingValue); outputIMDb(showCheckIn, traktSlug, ratingValue); }); } 不是通用函数的名称,所以我修改了我的代码,但我仍然得到resolve()返回< / p>

更新了选项1代码

ratingValue is undefined

更新2

抱歉,对于不包含// Set Deferred var d1 = $.Deferred(); // Return movie information if (idResp[0].type === "movie") { // Output Slug var traktSlug = 'movies/' + idResp[0].movie.ids.slug; // Output Div $.when(d1).done(function(ratingValue) { console.log('Rating Is: ' + ratingValue); outputIMDb(1, traktSlug, ratingValue); }); // Get Rating d1.resolve(getRating(idResp[0].type, idResp[0].movie.ids.trakt)); } 功能,我深表歉意。如下

getRating

1 个答案:

答案 0 :(得分:1)

要做的主要是写getRating()来回复承诺。您可以宣传XMLHttpRequest(),但使用jQuery.ajax()会更容易。

这是基于original code on GitHub

function getRating(type, id, season=0, episode=0) { // mmm, formal defaults - odd for browser-based javascript.
    var slugType;
    switch(type) {
        case 'movie':
            slugType = 'movies';
        break;
        default:
            slugType = 'movies';
    }
    return $.ajax({
        url: 'https://api.trakt.tv/' + slugType + '/' + id + '/ratings',
        headers: {
            'Content-Type': 'application/json',
            'trakt-api-version': '2',
            'trakt-api-key': APP_KEY
        },
        dataType: 'json'
    }).then(function(response) {
        return Math.round(response.rating * 10);
    }).then(null, function(xhr, textMessage, errorThrown) {
        console.error('getRating error: ', textMessage);
        return $.when(0); // error recovery.
    });
}

然后,在主程序中也使用jQuery.ajax()

chrome.storage.local.get('access_token', function(result) {
    var ACC_TOK = result.access_token;
    if (ACC_TOK && typeof ACC_TOK !== undefined) {
        if (tabURL.includes('imdb.com')) {
            $.ajax({
                url: 'https://api.trakt.tv/search/imdb/' + tabURL.match(/tt\d{7}/),
                headers: {
                    'Content-Type': 'application/json',
                    'trakt-api-version': '2',
                    'trakt-api-key': APP_KEY
                },
                dataType: 'json'
            }).then(function(idResp) {
                if(idResp[0].type === 'movie') {
                    return getRating(idResp[0].type, idResp[0].movie.ids.trakt).then(function(ratingValue) {
                        console.log('Rating Is: ' + ratingValue);
                        outputIMDb(1, 'movies/' + idResp[0].movie.ids.slug, ratingValue);
                    });
                } else {
                    console.log("Type: " + idResp.type);
                }
            }).fail(function(xhr, textMessage, errorThrown) {
                console.error(textMessage);
            });
        }
    }
});

请注意,由于jQuery.ajax()会返回一个承诺,因此无需生成/解析您自己的jQuery.Deferred()s

上面的代码可能不是100%正确,但应该与工作解决方案相距甚远。