【问题标题】:jQuery 1.5: Why is Deferred object calling .done() in UNRESOLVED state?jQuery 1.5:为什么延迟对象在 UNRESOLVED 状态下调用 .done()?
【发布时间】:2011-02-09 15:40:48
【问题描述】:

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

正如您在doSomething2() 中看到的那样,dfd 对象故意从未被解析。但是,当我运行以下代码时,doSomething() 中的 .done() 总是会触发。检查控制台,您将看到 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 的。我刚刚创建了这个例子来复制我的问题。我正在开发一个 Web 应用程序,该应用程序旨在从一个 html 文件在本地运行。在这种情况下,没有严格遵守SOP,所以至少测试一下应该没问题。

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

【问题讨论】:

    标签: jquery jquery-1.5 jquery-deferred


    【解决方案1】:

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

    看直播example

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

    callbacks.push(elem);

    您将声明传递为elem 并得到

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多