jQuery 1.5:为什么Deferred对象在UNRESOLVED状态下调用.done()?

时间:2011-02-09 15:40:49

标签: jquery jquery-1.5 jquery-deferred

我创建了一个测试页面,模仿我在实际页面上遇到的问题。

正如您在doSomething2()中看到的那样,dfd对象是故意永远无法解决的。但是,当我运行以下代码时,.done()中的doSomething()始终会触发。检查控制台,您会在dfd.isResolved()运行之前看到.done() false

任何见解?任何帮助表示赞赏

<!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的。我刚刚创建了这个例子来复制我的问题。我正在开发一个旨在从一个html文件本地运行的Web应用程序。在这种情况下,SOP没有严格遵守,所以至少应该测试。

编辑:我创建了一个jsfiddle来测试这种行为: http://jsfiddle.net/Sgwpv/2/

1 个答案:

答案 0 :(得分:1)

你的问题是将语句传递给.done而不是函数

查看实时example

在内部,.done获取一系列函数并将它们推送到回调数组,所以

callbacks.push(elem);

您传递的语句为elem并获得

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

将语句的返回值(在本例中为undefined)推送到回调数组而不是函数。