如何使用jquery deferred.then()函数?

时间:2013-07-29 15:34:46

标签: jquery asynchronous

我有一个jquery网站,我在 facebook API asynchronous call

我需要在调用API时运行loading widget,并在调用完成后隐藏窗口小部件。

出于这个原因,我决定使用jquery提供的deferred.then()方法。

这是我原来的异步调用

window.fbAsyncInit = function() {
            // init the FB JS SDK 
            FB.init({
                appId      : '564984346887426',                                                  // App ID from the app dashboard
                channelUrl : 'channel.html',                                                     // Channel file for x-domain comms
                status     : true,                                                               // Check Facebook Login status
                xfbml      : true                                                                // Look for social plugins on the page
            });
            FB.api('169070991963/albums', checkForErrorFirst(getAlbums));
        }

我尝试:

window.fbAsyncInit = function() {
            // init the FB JS SDK 
            FB.init({
                appId      : '564984346887426',                                                  // App ID from the app dashboard
                channelUrl : 'channel.html',                                                     // Channel file for x-domain comms
                status     : true,                                                               // Check Facebook Login status
                xfbml      : true                                                                // Look for social plugins on the page
            });
            $.mobile.loading("show");
            FB.api('169070991963/albums', checkForErrorFirst(getAlbums))
            .then(
                function(){ $.mobile.loading("hide");
            });
        }

但我得到错误:

Uncaught TypeError: Cannot call method 'then' of undefined 

我明白我错了。但是来自jquery站点的例子并没有帮助我理解它应该如何在这里完成。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

创建延迟对象

var $df = $.deferred();

编辑我错了,事情发生了变化,请参阅udpate。

FB.api接受第二个参数作为完成后触发的回调函数。

FB.api('169070991963/albums', checkForErrorFirst(getAlbums));

然后,在函数checkForErrorFirst()中,您需要解析对象

function checkForErrorFirst($arg){
    //yuor code
    $df.resolve();
}

然后当它被解决后,它会触发.done()所以我们提供回调

$df.done(function(){
     alert('resolved');
});