当jQuery.Deferred对象传递给deferred.resolve时,jQuery.Deferred是否有错误?

时间:2017-09-29 15:32:58

标签: javascript jquery promise jquery-deferred

给定使用Promise构造函数的代码

let promise = () => new Promise(resolve => resolve(1));

new Promise((resolve, reject) => {
  setTimeout(() => reject("10 seconds exceeded"), 10000);
  resolve(promise())
})
.then(data => console.log(data))
.catch(err => console.error(err));

1

上记录了

console

鉴于使用jQuery.Deferred的等效代码,jQuery.deferred对象会记录在.then(),而不是传递给jQuery.deferred.resolve的值

let promise = () => new $.Deferred(dfd => dfd.resolve(1));

new $.Deferred(dfd => {
  setTimeout(() => dfd.reject("10 seconds exceeded"), 10000);
  dfd.resolve(promise());
})
.then(data => console.log(data))
.fail(err => console.error(err));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js">
</script>

虽然将jQuery.deferred承诺对象传递给.then()确实会返回预期结果

let promise = () => new $.Deferred(dfd => dfd.resolve(1));

new $.Deferred(dfd => {
  setTimeout(() => dfd.reject("10 seconds exceeded"), 10000);
  promise().then(data => dfd.resolve(data));
})
.then(data => console.log(data))
.fail(err => console.error(err));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js">
</script>

输出是否与jQuery的Promisespecification的实现相关的jQuery错误?

1 个答案:

答案 0 :(得分:1)

这不是错误,但它可能是缺少的功能。 jQuery从未尝试过实现标准的Promise构造函数,它的Deferred构造函数做了一些完全不同的事情。不可否认,如果resolve实际履行,他们肯定会混淆标准术语;然而,jQuery的实现确实早于标准,所以它并不奇怪。

  

输出是否与jQuery的Promise / A +规范实现相关的jQuery错误?

不,Promise / A +规范只关注then函数的行为,而不是promise构造。 jQuery的promise实现中有were indeed many inherent problems,但从版本3开始,至少已经修复了这些(can be tested),因此jQuery promise实例现在可以与所有其他实现互操作。