1
/**
 * 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;
}

添加了一个使用词法局部变量的新版本。还是行不通。此刻我有点迷失了......还添加了一个日志语句,它只被调用一次。我希望日志被调用两次。

有任何想法吗?

4

2 回答 2

1

问题不在于您的 done 回调被调用一次,而是您 fingerprintPreview每次调用它时都更改相同,因为that在调用 callbaks 时具有 end of loop 的值。

解决方案是不要重用这个外部声明的变量,而是一个新的,在你给的函数中声明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");
            }
        });

});
于 2013-06-12T10:29:31.993 回答
0

我发现了问题所在。dystroys 的答案是正确的,但没有解决我原来的问题。所以事情是,当我在完成函数回调中有一个萤火虫断点时,它只会被调用一次。所以用firebug设置断点可能会导致无法解释的js代码...... ffs!

于 2013-06-12T11:43:05.880 回答