jQuery的承诺和延迟对象在异步回调中的作用

jQuery的承诺和延迟对象在异步回调中的作用
一、前言

为了使前端回到天堂从回调的地狱,jQuery也介绍了承诺的概念。承诺是一个更优雅的抽象代码的异步行为,通过它,我们可以编写异步代码像写同步code.jquery实施了重量级的解决方案的承诺/ CommonJS从版本1.5一个规范,但并没有按照规范严格执行。api上有一些差异。

让我们看看它们的特性(本文基于jQuery 1.8)。

两。实例

当我们使用动画时,我们通常会这样做。
$('。animateele动画({)。
不透明性:5
},4000,函数(){()
$('。animateele2动画({)。
宽度:'100px
},2000,函数(){()
这个太疼了。
$('。animateele3动画({)。
高度:'0'
},2000);
});
});
如果你使用回调,那就太痛苦了。幸运的是,有一些可行的解决方案可以很好地解决这个问题。

让我们看看jQuery提供的解决方案。
无功animate1 =函数(){()
返回$('。animateele1)。动画({不透明度:'。5},4000)承诺();
};
无功animate2 =函数(){()
返回$('。animateele2)。动画({宽度:'100px},2000)承诺();
};
无功animate3 =函数(){()
返回$('。animateele3)。动画({身高:0},2000)承诺();
};
如此简单,如此清晰,木头,木头
美元。当(animate1())。然后(animate2)。然后(animate3);
显然,更改后的代码更容易阅读和可读。

然而,上述代码的细节尚未披露。如果我们不小心,很容易出错,我们不能按照我们想要的顺序实现动画效果。让我们充分了解jQuery提供的允诺和延迟对象的方法,看看它是如何使用的。

三,承诺,和延迟对象的方法

允诺对象实际上是延迟对象的一种特殊情况,因为允诺对象不能改变异步状态,而延迟对象可以,这是它们方法设计的明显体现。

1.promise对象的方法

一般来说,对于DOM、动画和Ajax相关的方法,我们都可以使用承诺方法。

允诺对象有三种常用方法:完成、失败、然后。

另一种方法是不记得了,jQuery的接口方法太多了,在我看来很罗嗦,绑定早期事件的方法,比如直播、委托、绑定,就被归类为最终不控制它。

代码示例如下所示:

(1)DOM使用承诺方法:
VaR箱=美元(' #盒);
Box.promise(),做(功能(ELE){
console.log(ELE); / / jQuery盒
});
(2)Ajax使用允诺方法(默认返回一个允诺对象,因此您不必显式调用允诺方法):
美元。
console.log(请求成功);
}失败(函数(){)
console.log(请求错误);
});
动画示例已经就位,它们不再被列出来了。

2.deferred对象的方法

那么,延期和承诺有什么区别呢正如您在前面看到的,承诺是由异步函数返回的对象。当您想编写这样的函数时,需要使用一个延迟函数。

一个延迟对象可以像一个承诺对象那样做,但是它有两个函数来触发完成()和失败()函数。

一个延迟对象拥有一个解析()函数来处理一个成功的结果,并执行一个与完成()函数相关的函数。拒绝函数用于处理失败的结果,并执行与失败()相关的函数。

您可以为两个解析()函数和拒绝()函数提供参数,然后它们都传递与完成()和失败()相关的回调函数。

承诺对象没有解析()和拒绝()函数,这是因为您在其他脚本中承诺,而您不希望承诺去解决或拒绝承诺。

下面是一个简单的延迟示例,Html只是一个带有结果id属性的空div。
$(#结果)。Html('waiting…);

var允诺=等待();
promise.done(结果);

函数结果(){
$(#结果)。Html('done);
}

函数等待(){
递延值=递延();

setTimeout(){()函数(
deferred.resolve();
},2000);

返回deferred.promise();
}

在这,等待()函数返回一个承诺。它将解析后2s。除了setTimeout在异步函数都可以这样用,如动画、网络工作者,等等。在等待代码()函数应该是明确的,我们使用了延迟对象,但我们返回一个对象限制的承诺。

对于延迟对象,也就是说,使用$递延()方法,以及由方法创建的对象,例如$(),下面是常用的方法:
解决、拒绝、通知;
做了,失败了,进步了;
还有承诺,然后,还有永远的方法。

因此,排版是因为它们是对应的,也就是说:解析方法、触发器执行的回调执行、拒绝触发器失败回调、通知触发进程的回调。

直接查看代码:
var =函数(MS){
var(=);
setTimeout(dtd.resolve,MS);
/ / setTimeout (dtd.reject, MS);
/ / setTimeout (dtd.notify, MS);
返回(DTD);这里也可以返回到DTD
};

等待(2500)。完成(函数(){)
console.log('haha,',你可以让旧的等待);
}失败(函数(){)
console.log('failed);
}:进度(函数(RES){)
console.log('waiting为…);
});

我们看到,在上面的代码中,在等待函数中,返回一个允诺对象,而不是一个延迟对象。

要知道,承诺对象不是解析、拒绝、通知等。这意味着你不能改变的承诺对象的状态,并且只能配置回调在做或失败。所以,如果你呼叫等待(2500)。解决()这个方法,这将是错误的,因为等待(2500)返回一个承诺的对象,并没有解决方法

然而,这样做有好处,我们将DTD延迟对象作为一个局部变量放在外部t函数中,以避免全局污染;进一步通过承诺方法,将DTD对象的延迟转换为允诺对象,避免等待外部状态变化的可能功能(如果我们确实有这种需求)。

例如:
var =函数(MS){
var(=);
setTimeout(dtd.resolve,MS);
/ / setTimeout(dtd.reject,MS);
/ / setTimeout(dtd.notify,MS);
返回DTD,这里也可以返回到DTD
};

等待(2500)。拒绝()。失败(函数(){)
console.log('failed…);
});

我们已经更改了外部等待返回的延迟对象的状态,这不可避免地触发对象的失败回调函数。

对于总是的方法,从字面意义上很容易理解,延迟对象,无论是解析还是拒绝,都触发该方法的回调。

三.其他共性

在这里描述了当时和当时的方法,它们也适用于允诺对象。

$方法接受多个延迟对象或纯Javascript对象,并返回到承诺对象。

当时的方法是以三的回调,反过来,这是由延迟对象触发回调的决心,拒绝,并通知,并返回到一个承诺的对象。需要注意的是,函数必须通过,它只返回一个承诺对象启用异步事件是在预期的顺序执行。

我们看看开头的动画实例代码,美元。当(animate1)(,)(animate2)。然后(animate3),美元。当接收到一个结果animate1功能的实现,这是得到一个承诺的对象,然后,然后,就接受一个变量名,这样得到的结果是一个匿名函数和函数返回对象的承诺。恰逢我们然后接受参数的要求。

如果我们改变执行语句美元。当(animate1())。然后(animate2())。然后(animate3()),结果是三个动画同步执行。这不是达相同。当(animate1(),animate2()()(),animate3)。

从那时起,要求很高,然后完成,失败,和进步,类似于当时的方法,是相同的。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部