Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';延迟对象和它自己的承诺对象之间的区别是什么?_Javascript_Jquery_Deferred - Fatal编程技术网

Javascript 什么';延迟对象和它自己的承诺对象之间的区别是什么?

Javascript 什么';延迟对象和它自己的承诺对象之间的区别是什么?,javascript,jquery,deferred,Javascript,Jquery,Deferred,让我们创建一个简单的延迟对象: defer = $.Deferred( function ( defer ) { setTimeout( defer.resolve, 3000 ); }); promise = defer.promise(); 上述延迟对象将处于“挂起”状态3秒钟,然后切换到“已解决”状态(此时将调用绑定到它的所有回调) 我们还将检索延迟对象的承诺: defer = $.Deferred( function ( defer ) { setTimeout( d

让我们创建一个简单的延迟对象:

defer = $.Deferred( function ( defer ) {
    setTimeout( defer.resolve, 3000 );
});
promise = defer.promise();
上述延迟对象将处于“挂起”状态3秒钟,然后切换到“已解决”状态(此时将调用绑定到它的所有回调)

我们还将检索延迟对象的承诺:

defer = $.Deferred( function ( defer ) {
    setTimeout( defer.resolve, 3000 );
});
promise = defer.promise();
现在,要添加解析延迟对象后将调用的回调,我们可以使用
.done()
.then()
。但是,我们可以对延迟对象本身或它自己的promise对象调用此方法

defer.then( handler );

在这两种情况下,都将调用
处理程序
函数(在本例中为3秒后)

如果我们使用
$。当
时,我们可以再次传递延迟对象本身或其承诺对象:

$.when( defer ).then( handler );

同样,上述两行代码之间没有区别

现场演示:

因此,我的问题是,既然我们可以在延迟对象本身上调用
.then()
.done()
等,既然我们可以将延迟对象传递到
$。当()
时,
.promise()
和检索promise对象有什么意义?承诺对象的目的是什么?为什么功能中会有这种冗余?

它创建延迟值的“密封”副本,没有
.resolve()
.reject()
方法。发件人:

deferred.promise()
方法允许异步函数防止其他代码干扰其内部请求的进度或状态


当修改值没有意义时,使用它。例如,当jQuery发出AJAX请求时,它返回一个promise对象。在内部,它
.resolve()
是原始
延迟对象的一个值,用户通过承诺来观察该对象。

当使用延迟对象的“承诺”时,观察者(例如等待解析的对象)无法直接访问延迟对象本身,因此他们无法调用该方法“解析”该延迟。这是一种保护原始延迟的方法。

使用延迟,您可以控制其状态
设置


说到承诺,你可以读取state,也可以附加callback。
get

啊,这是一个密封的副本duh…这就解释了。为了进一步说明这一点,我更清楚地看到:“承诺对象-这个对象提供了延迟对象的方法的子集(然后,完成、失败、始终、管道和状态)以防止用户更改延迟服务器的状态。“