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;
}

レキシカルローカル変数を利用する新しいバージョンが追加されました。まだ動作していません。現時点では少し迷っています...一度だけ呼び出されるログステートメントも追加しました。ログが 2 回呼び出されることを期待します。

何か案は?

4

2 に答える 2

1

問題は、done コールバックが 1 回 呼び出されることではなく、callbak が呼び出されたときにループの終わりの値を持っている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");
            }
        });

});
于 2013-06-12T10:29:31.993 に答える
0

私は問題が何であるかを知りました。dystroys の答えは正しいですが、元の問題に対処していませんでした。そのため、完了した関数のコールバックに firebug ブレークポイントがある場合、それは 1 回だけ呼び出されます。そのため、firebug でブレークポイントを設定すると、js コードが解釈されない可能性があります... ffs!

于 2013-06-12T11:43:05.880 に答える