本篇文章为大家展示了承诺如何在jQuery中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
打开浏览器的控制台先。
& lt; script> var 才能;defer =, .Deferred美元(); console.log才能(延迟); & lt;/script>
运行结果:
, & lt; script> function 才能;runAsync () { ,,,var defer =, .Deferred美元(); ,,,//做一些异步操作 ,,,setTimeout(函数(){ ,,,,,console.log(& # 39;执行完成& # 39;); ,,,,,defer.resolve(& # 39;异步请求成功之后返回的数据& # 39;); ,,,},,1000); ,,,return 推迟; ,,} runAsync才能(),然后(功能(数据){ ,,,console.log(数据) ,,}); & lt;/script>
运行之后,延迟对象的实例延迟通过解决方法把参数“异步请求成功之后返回的数据“传回到那方法中进行接收,,打印。
和ES6的承诺相似,但是有一点点区别,再看下承诺:
& lt; script> function 才能;runAsync () { ,,,var p =, new 承诺(函数(解决,,拒绝){ ,,,,, ,,,,,setTimeout(函数(){ ,,,,,,,console.log(& # 39;执行完成& # 39;); ,,,,,,,解决(& # 39;异步请求成功之后返回的数据& # 39;); ,,,,,},,1000); ,,,}); ,,,return p,,,,,,, ,,} runAsync才能(),然后(功能(数据){ ,,,console.log(数据); ,,}); & lt;/script>
我们发现:
1,创建延迟对象的时候没有传参,而创建承诺对象的时候,传了参数(传了一个匿名函数,函数也有两个参数:决心,拒绝),
2,延迟对象直接调用了解决方法;而承诺对象则是在内部调用的解决方法;
说明:递延对象本身就有解决方法,而承诺对象是在构造器中通过执行解决方法,给承诺对象赋上了执行结果的状态。
这样就有一个弊端:因为递延对象自带解决方法,拿到递延对象之后,就可以随时调用解决方法,其状态可以进行手动干预了
& lt; script> function 才能;runAsync () { ,,,var defer =, .Deferred美元(); ,,,//做一些异步操作 ,,,setTimeout(函数(){ ,,,,,console.log(& # 39;执行完成& # 39;); ,,,,,defer.resolve(& # 39;异步请求成功之后返回的数据& # 39;); ,,,},,1000); ,,,return 推迟; ,,} ,var der =, runAsync (); ,der.then(功能(数据){ ,,,console.log(数据) ,}); ,der.resolve(& # 39;在外部结束& # 39;),, & lt;/script>
,这样的话就直接在外部直接给递延设置了状态,打印”在外部结束”,1 s后打印“执行完成”,不会打印“异步请求成功之后返回的数据”了。
显然,这不好。我发个异步请求,还没收到数据就让人在外部给我结束了.......
当然这个坑jQuery肯定会填的,在递延对象上有一个承诺方法,是一个受限的延迟对象
& lt; script> function 才能;runAsync () { ,,,var def =, .Deferred美元(); ,,,//做一些异步操作 ,,,setTimeout(函数(){ ,,,,,console.log(& # 39;执行完成& # 39;); ,,,,,def.resolve(& # 39;请求成功之后返回的数据& # 39;); ,,,},,2000); ,,,return def.promise();,//就在这里调用 ,,} & lt;/script>
所谓受限的延迟对象,就是没有决心和拒绝方法的递延对象。这样就无法在外边改变延迟对象的状态了。
<强>递延对象的那方法和完成,失败语法糖强>
我们知道,在ES6的承诺规范中,然后方法接受两个参数,分别是执行完成和执行失败的回调,而jquery中进行了增强,还可以接受第三个参数,就是在等待状态时的回调,如下:
<代码>延期。然后(doneFilter [failFilter] [, progressFilter]) 代码>
然后方法:
& lt; script> function 才能;runAsync () { ,,,var def =, .Deferred美元(); ,,,//做一些异步操作 ,,,setTimeout(函数(){ ,,,,,,var num =, Math.ceil (math . random() * 10);,//生成1 - 10的随机数 ,,,,,,,如果(num承诺如何在jQuery中使用