0

実際のページで発生している問題を模倣したテストページを作成しました。

でわかるようにdoSomething2()、dfdオブジェクトは意図的に解決されることはありません。ただし、次のコードを実行すると、.done()inはdoSomething()常に起動します。コンソールを調べると、実行直前にそれdfd.isResolved()誤り.done()であることがわかります。

洞察はありますか?どんな助けでも大歓迎です

<!DOCTYPE html> 
<html> 
<head>
    <title>Testing Page</title>
    <script src="jquery-git-02092011.js" type="text/javascript"></script>
</head>
<body>
    <div id="test">
            <div ></div>
            <div ></div>
    </div>

    <script>
        function doSomething() {
            $('#test div').each(function(){
                $(this).append($('<div></div>').load('http://www.google.com',function(){
                    doSomething2().done(console.log('dosomething2 is complete'));   
                }))
            });
        }

        function doSomething2() {
            var dfd = $.Deferred();
            console.log(dfd.isResolved());
            return dfd;
        }

        $(document).ready(function() {
          doSomething();
        });
    </script>
</body>
</html>

編集:私はこの関数が何も達成しないことを理解しています。問題を再現するための例を作成しました。'google.com'の取得はSOPに反することを理解しています。問題を再現するために、この例を作成しました。1つのhtmlファイルからローカルで実行することを目的としたWebアプリを開発しています。この場合、SOPは厳密に守られていないため、少なくともテストは問題ありません。

編集:この動作をテストするためにjsfiddleを作成しました:http: //jsfiddle.net/Sgwpv/2/

4

1 に答える 1

1

あなたの問題は、これが関数ではなく.doneにステートメントを渡すことです

実例を見る

内部的に.doneは、関数のリストを取得し、それらをコールバック配列にプッシュします。

callbacks.push(elem);

次のようにステートメントを渡してelem

callbacks.push(alert("foo"));

ステートメント(この場合undefined)の戻り値を関数ではなくコールバック配列にプッシュします。

于 2011-02-09T17:02:58.133 に答える