Javascript 将jQuery.Deferred对象传递给Deferred.resolve时,jQuery.Deferred是否存在错误?
给定使用Javascript 将jQuery.Deferred对象传递给Deferred.resolve时,jQuery.Deferred是否存在错误?,javascript,jquery,promise,jquery-deferred,Javascript,Jquery,Promise,Jquery Deferred,给定使用Promise构造函数的代码 let promise=()=>new promise(解析=>resolve(1)); 新承诺((解决、拒绝)=>{ 设置超时(()=>拒绝(“超过10秒”),10000; 解析(promise()) }) .then(数据=>console.log(数据)) .catch(err=>console.error(err))这不是一个bug,但可能是缺少的功能。jQuery从未尝试实现标准的Promise构造函数,它的延迟的构造函数做了一些完全不同的事情。
Promise
构造函数的代码
let promise=()=>new promise(解析=>resolve(1));
新承诺((解决、拒绝)=>{
设置超时(()=>拒绝(“超过10秒”),10000;
解析(promise())
})
.then(数据=>console.log(数据))
.catch(err=>console.error(err))代码>这不是一个bug,但可能是缺少的功能。jQuery从未尝试实现标准的Promise
构造函数,它的延迟的构造函数做了一些完全不同的事情。诚然,如果resolve
确实实现了,那么它们肯定会弄乱标准术语;然而,jQuery的实现确实早于该标准,所以这并不奇怪
输出是否与jQuery实现Promise/a+规范相关
不,Promise/A+规范只涉及then
函数的行为,而不是Promise构造。在jQuery的promise实现中没有这样的问题,但自从第3版以来,这些问题已经得到了解决(这一点),因此jQuery promise实例现在可以与所有其他实现进行互操作。jQuery从未实现过promise
您使用的是哪个版本的jQuery?为什么您都要解决和拒绝这个承诺?立即的resolve
总是会赢。你能尝试传递jQuery承诺而不是jQuery延期吗?@Bergi stacksnippets使用的jQuery版本是3.2.1,尽管2x返回相同的结果results@guest271314这只是意味着类似于Promise.resolve(jQuery.Deferred(…)。然后(x=>Promise.resolve())的东西
开箱即用,这使得删除jQuery并使用适当的实现变得很容易。我知道您无法解释jQuery实现决定实现或不实现某个功能的原因,尽管您有任何迹象表明jQuery作者和贡献者知道Promise
模式和jQuery.Deferred()
模式之间的显著区别吗?“否,Promise/A+规范仅与then
函数的行为有关”不是。then()
期望Promise
的值可用,而不是Promise
对象本身?也就是说,jQuery.deferred.then
实现是否符合规范?当然,jQuery.deferred.then
的结果与使用与本机相同模式的输出不一致。then()
@guest271314 Yes,每个人都知道延迟构造函数模式和承诺构造函数模式之间的显著差异(并且resolve
不解决但实现只是另一种模式),但我不知道有什么打算对此做些什么。是的,jQuery-v3的then
符合规范-它使用承诺实现的任何值调用回调。有多个实现允许使用其他承诺对象履行承诺(尽管ES6不是其中之一)。@guest271314您没有使用1
进行解析,而是使用。使用返回值promise()
解析d。显然jQuery直接将其作为实现值。除了命名差异resolve
vsfulfill
,没有任何东西表明这应该以不同的方式工作,因为没有延迟的规范。