Javascript JQuery承诺。通知需要关闭。。。

Javascript JQuery承诺。通知需要关闭。。。,javascript,jquery,closures,jquery-deferred,Javascript,Jquery,Closures,Jquery Deferred,我认为我在闭包/范围界定方面有问题。当我观察MyObject的进度时,我总是得到I的最终值 示例 var a = new MyObject(); a.progress(function(msg){console.log(msg)}); // always prints 1000/1000 可观察对象 function MyObject() { var this.dfd = $.Deferred(); return this.dfd.promise();

我认为我在闭包/范围界定方面有问题。当我观察
MyObject
的进度时,我总是得到
I
的最终值

示例

var a = new MyObject();
a.progress(function(msg){console.log(msg)}); // always prints 1000/1000
可观察对象

    function MyObject()
    {
       var this.dfd = $.Deferred();
      return this.dfd.promise();
    } 

    MyObject.prototype.aProcess = function()
        {
            var self = this;
            for (var i = 0; i < 1000; i++)
            {
                (function(i)
                {

                   self.notify("Updating " + (i+1) + "/" + 1000); 
                   // Bunch of Processes

                })(i);
            }
        }

    MyObject.prototype.notify = function(message)
    {
        console.log(message) // works fine
        this.dfd.notify(message);   
    }
函数MyObject()
{
var this.dfd=$.Deferred();
返回此.dfd.promise();
} 
MyObject.prototype.aProcess=函数()
{
var self=这个;
对于(变量i=0;i<1000;i++)
{
(职能(一)
{
自我通知(“更新”+(i+1)+“/”+1000);
//一系列过程
})(i) );
}
}
MyObject.prototype.notify=函数(消息)
{
console.log(message)//工作正常
此.dfd.notify(消息);
}

您正在执行
。请在返回延迟之前处理
,因此,在连接进度侦听器时,通知已经运行

试试这个:

函数MyObject(){
this.dfd=$.Deferred();
//不要显式返回对象,否则该类将无效。
};
MyObject.prototype.process=函数(){
//关闭在这里是没有用的
对于(变量i=0;i<1000;i++){
通知(“更新”+(i+1)+“/”+1000);
}
};
MyObject.prototype.notify=函数(消息){
//从此处删除console.log以避免混淆
此.dfd.notify(消息);
}
var a=新的MyObject();
a、 dfd.promise().progress(函数(msg){
控制台日志(msg)
}); // 始终打印1000/1000
a、 过程();​

您正在执行
.process
操作,然后返回延迟的进程,因此在连接进度侦听器时,通知已经运行

试试这个:

函数MyObject(){
this.dfd=$.Deferred();
//不要显式返回对象,否则该类将无效。
};
MyObject.prototype.process=函数(){
//关闭在这里是没有用的
对于(变量i=0;i<1000;i++){
通知(“更新”+(i+1)+“/”+1000);
}
};
MyObject.prototype.notify=函数(消息){
//从此处删除console.log以避免混淆
此.dfd.notify(消息);
}
var a=新的MyObject();
a、 dfd.promise().progress(函数(msg){
控制台日志(msg)
}); // 始终打印1000/1000
a、 过程();​


它在JSFIDLE中打印正确的数字。。。另外,既然您没有返回
MyObject
的实例,那么这个类有什么意义呢?除非我大错特错,否则它会一直记录
1/1000
,直到
1000/1000
,就像它应该记录的那样。虽然它会打印
1000/1000
两次…
console.log
可能会在查看时打印实际值,而不是在执行代码时打印。因此,如果您看到了这一点,并且不相信自己的眼睛,请尝试改用js调试器。PS:正如@Esailija在下面指出的:它只对js对象有效,而对primitive无效types@zerkms对于primitive,情况并非如此values@Esailija:是的,我正在写一封信;-)它在JSFIDLE中打印正确的数字。。。另外,既然您没有返回
MyObject
的实例,那么这个类有什么意义呢?除非我大错特错,否则它会一直记录
1/1000
,直到
1000/1000
,就像它应该记录的那样。虽然它会打印
1000/1000
两次…
console.log
可能会在查看时打印实际值,而不是在执行代码时打印。因此,如果您看到了这一点,并且不相信自己的眼睛,请尝试改用js调试器。PS:正如@Esailija在下面指出的:它只对js对象有效,而对primitive无效types@zerkms对于primitive,情况并非如此values@Esailija:是的,我正在写一封信;-)这很有效。在实现中,该类是一个解析器。我只想在一些JSON中传递构造函数,然后将其解析为webSql db,并能够观察它的进度/完成/失败。那么,我的方法是错误的吗?让构造函数返回承诺是没有意义的?@CrimsonChin err yes,因为当您在构造函数中显式返回对象时,将返回该对象,而不是调用
new
时创建的对象。因此,您将无法访问创建的对象,因此没有创建类的意义。如果我让MyObject.parse返回承诺,在类中提供一个干净的观察者,该怎么办?当然,只是构造函数不必返回任何内容,这样当使用
new
调用创建的对象时,我可以看到您是如何解决这个问题的,并且我理解为什么会出现这个问题。如何使MyObject成为延迟对象?我不想访问MyObject的延迟对象(dfd属性),我想我最终想要的是MyObject成为延迟对象。有可能吗?那行得通。在实现中,该类是一个解析器。我只想在一些JSON中传递构造函数,然后将其解析为webSql db,并能够观察它的进度/完成/失败。那么,我的方法是错误的吗?让构造函数返回承诺是没有意义的?@CrimsonChin err yes,因为当您在构造函数中显式返回对象时,将返回该对象,而不是调用
new
时创建的对象。因此,您将无法访问创建的对象,因此没有创建类的意义。如果我让MyObject.parse返回承诺,在类中提供一个干净的观察者,该怎么办?当然,只是构造函数不必返回任何内容,这样当使用
new
调用创建的对象时,我可以看到您是如何解决这个问题的,并且我理解为什么会出现这个问题。如何使MyObject成为延迟对象?我不想访问MyObject的延迟对象(dfd属性),我想我最终想要的是MyObject成为延迟对象。可能吗?
function MyObject() {
    this.dfd = $.Deferred();
    //Don't explicitly return an object, otherwise the class is useless.
};
MyObject.prototype.process = function() {
    //The closure was useless here
    for (var i = 0; i < 1000; i++) {
        this.notify("Updating " + (i + 1) + "/" + 1000);
    }
};
MyObject.prototype.notify = function(message) {
    //Remove console.log from here to avoid confusion
    this.dfd.notify(message);
}
var a = new MyObject();
a.dfd.promise().progress(function(msg) {
    console.log(msg)
}); // always prints 1000/1000
a.process();​