我的done回调只被调用一次,我不知道为什么

jquery my done callback gets only called one time i dont get why

本文关键字:一次 为什么 我不知道 回调 done 调用 我的      更新时间:2023-09-26
/**
 * Downloads the fingerprint preview data 
 */
this.fetchFingerprintPreviews = function (url) {
    var that = this;
    var dfd = jQuery.Deferred();
    jQuery.get(url)
        .done(function (resp) {
            var linkNodes = conn.getLinksViaRelation(resp,  
            'http://ws.bdr.de/webhd/hdcap/rels/finger-preview/');
            jQuery(linkNodes).each(function () {
                var link = jQuery(this);
                var fpIndex = link.prev("index, bdr'':index").html();
                var fpType = link.attr('type');
                jQuery.get(link.attr('href'), {"encoding":"base64"}, null, "text")
                    .done(function (imageDataBase64) {
                        fingerprintPreview[fpIndex] = {};
                        fingerprintPreview[fpIndex].imageData = imageDataBase64;
                        fingerprintPreview[fpIndex].type = fpType;
                        console.log(fingerprintPreview);
                        if (Object.keys(fingerprintPreview).length == 
                        Object.keys(linkNodes).length) {
                            dfd.resolve();
                        }
                    });
            });
        });
    return dfd;
}

添加了一个使用词法局部变量的新版本。还是不行。我现在有点迷路了……还添加了一个只被调用一次的日志语句。我希望日志被调用两次。

任何想法?

问题不在于你的完成回调被调用一次,但你改变相同的fingerprintPreview每次它被调用,因为that有循环结束的值当回调被调用。

解决方案是不重用这个外部声明的变量,而是一个新的,在你给each的函数中声明:

jQuery(linkNodes).each(function () {
    var link = jQuery(this);
    var fpIndex = link.prev("index, bdr'':index").html();
    var fpType = link.attr('type');
    jQuery.get(link.attr('href'), {"encoding":"base64"}, null, "text")
        .done(function (imageDataBase64) {
            fingerprintPreview[fpIndex] = {};
            fingerprintPreview[fpIndex].imageData = imageDataBase64;
            fingerprintPreview[fpIndex].type = fpType;
            if (Object.keys(fingerprintPreview).length == Object.keys(linkNodes).length) {
                alert("foo");
            }
        });
});

我发现了问题所在。Dystroys的回答是正确的,但并没有解决我最初的问题。所以事情是,当我在我的完成函数回调中有一个firebug断点时,它将只被调用一次。所以用firebug设置断点会导致无法解释的js代码…ffs !