优雅地书写回调——Promise

第一,来谈jquery下的Promise

原本写一个动画是这样子的,回调函数嵌套,非常不优雅:

<script type="text/javascript">
$(‘.animateEle‘).animate({
  opacity:‘.5‘
}, 4000,function(){
  $(‘.animateEle2‘).animate({
    width:‘100px‘
  },2000,function(){
    $(‘.animateEle3‘).animate({
      height:‘0‘
    },2000);
  });
});
</script> 

使用了jquery的Promise对象后,优雅多了:

<script type="text/javascript">
var animate1 = function() {
  return $(‘.animateEle1‘).animate({opacity:‘.5‘},4000).promise();
};
var animate2 = function() {
  return $(‘.animateEle2‘).animate({width:‘100px‘},2000).promise();
};
var animate3 = function(){
  return $(‘.animateEle3‘).animate({height:‘0‘},2000).promise();
};
$.when(animate1()).then(animate2).then(animate3);
</script>

对于DOM,动画,ajax相关方法,都可以使用 promise 方法。调用 promise 方法,返回的是 promise 对象。可以链式调用 promise 方法。

promise对象常见的方法有三个 : done , fail , then 。

比如jquery中的ajax的 $.post $.get $.ajax 等方法,实际上都是默认调用了promise方法,然后返回了一个promise对象

<script type="text/javascript">
$.get(‘/‘,{}).done(function(data){
    console.log(‘success‘);
}).fail(function(){
    console.log(‘fail‘);
});
</script>

第二,ECMA6提供了Promise对象

举个例子:

1 function timeout(ms) {
2   return new Promise((resolve, reject) => {
3     setTimeout(resolve, ms, ‘done‘);
4   });
5 }
6
7 timeout(100).then((value) => {
8   console.log(value);
9 });

上面代码中,timeout方法返回一个Promise实例。resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”。过了指定的时间(ms参数)以后,Promise实例的状态变为Resolved,就会触发then方法绑定的回调函数。

再举个例子:

 1 let promise = new Promise(function(resolve, reject) {
 2   console.log(‘Promise‘);
 3   resolve();
 4 });
 5
 6 promise.then(function() {
 7   console.log(‘Resolved.‘);
 8 });
 9
10 console.log(‘Hi!‘);
11
12 // Promise
13 // Hi!
14 // Resolved

上面代码中,Promise新建后立即执行,所以首先输出的是“Promise”。然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以“Resolved”最后输出。

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});

then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为Resolved时调用,第二个回调函数是Promise对象的状态变为Reject时调用。其中,第二个函数是可选的,不一定要提供。

时间: 2024-10-15 20:53:56

优雅地书写回调——Promise的相关文章

框架基础:ajax设计方案(五)--- 集成promise规范,更优雅的书写代码

距离上一篇博客书写,又过去了大概几个月了,这段时间暂时离开了这个行业,让大脑休息一下.一个人旅行,一个人休息,正好也去完成一个目标 --- 拥有自己的驾照.当然,也把自己晒的黑漆马虎的.不过这一段时间虽然在技术上没有学太多东西,但是在心态上给了自己一个沉淀的机会,感觉自己变得更加沉稳和成熟,感觉这就是自己需要找到的自己,回归自我.好了,废话不多说了,虽然技术上没有学一些新的东西,但是欠的东西还是要补回来的.正如这篇博客,前端Promise规范的实现与ajax技术的集成,当时github上一个用户

如何才能优雅地书写JS代码

第一:关于匿名函数的使用 要避免全局变量泛滥, 可以考虑使用匿名函数, 把不需要在外部访问的变量或者函数限制在一个比较小的范围内. 例如以下代码: <script> function func1(){ var list = ["a", "b", "c"]; for(var i = 0; i < list.length; i++){ //.. }; } func1(); // 自动运行 </script> 上述代码的作

js执行顺序/Promise优雅解决回调函数嵌套

先执行同步 然后把settimeout(function xx(){}放进堆栈 然后执行回调 function xx() /** * Created by Administrator on 2016/10/28. */ // nodejs 封装操作文件的功能 fs var fs = require('fs'); //同步读取 // var str = '' // str += fs.readFileSync('./data/01','utf-8'); // str += fs.readFileS

ES6语法(3)—— 用promise()对象优雅的解决异步操作

Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大. 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理. 上面两段话是阮大神对于promise对象的一些总结,我再浓缩一下   Promise就是用于处理异步操作的!   关于异步操作和同步操作的区别以及他们在浏

JavaScript及其异步实现续:Promise让一切更简单

在写这篇文章之前,我参考了以下文章.所以我文中的例子都是精准的,而且有循可依.下面抛出例子的链接: Understanding JQuery.Deferred and PromiseDeferred and promise in jQuery Edit:在翻网站的时候,看到腾讯技术团队居然也刚写了一篇Promise的文章,加下链接,以作备忘. JavaScript Promise启示录 Deferred在JQuery1.5的版本被引进,这项功能的引进使JQuery变得更加强大,良好的异步支持,让

编程思想之回调

原文:http://blog.csdn.net/luoweifu/article/details/41465289 <回调的原理.实现与应用>一文中已经初步讲了回调的原理和应用,并就一个实际需求用函数的方式实现了回调应用.但回调并不仅限于回调函数,可以有很多不同的现实方式.回调与其说是一种技术,不如说是一种编程思想,我们在各种计算机语言中都能看到它的踪影.我们以<回调的原理.实现与应用>一文中提到的需求为例,看看C++.JavaScript.Java等各种语言下回调的实现方式. 有

回调之编程思想

<回调的原理.实现与应用>一文中已经初步讲了回调的原理和应用,并就一个实际需求用函数的方式实现了回调应用.但回调并不仅限于回调函数,可以有很多不同的现实方式.回调与其说是一种技术,不如说是一种编程思想,我们在各种计算机语言中都能看到它的踪影.我们以<回调的原理.实现与应用>一文中提到的需求为例,看看C++.JavaScript.Java等各种语言下回调的实现方式. 有一Person类,有年龄(age),体重(weight),身高(height)三个属性.现要对Person的一组对象

异步JavaScript与Promise

异步? 我在很多地方都看到过 异步(Asynchronous)这个词,但在我还不是很理解这个概念的时候,却发现自己常常会被当做"已经很清楚"(* ̄? ̄). 如果你也有类似的情况,没关系,搜索一下这个词,就可以得到大致的说明.在这里,我会对JavaScript的异步做一点额外解释. 看一下这段代码: JavaScript代码 var start = new Date(); setTimeout(function(){ var end = new Date(); console.log(&

拒绝回调,拥抱async await

之前使用jquery中ajax,请求的结果需要写在回调函数里面,后面接触到了axios/fetch,使用了es6中Promise进行封装,这种链式结构调用,看起来比之前直观,可是还是没有解决需要把结果写在回调函数里面,甚至axios/fetch相比原生ajax以及jquery中的ajax来说,不支持同步请求,这就导致:当一个请求需要的参数是依赖上一次请求返回的结果时,只能把第二次请求也写在第一次请求的回调里面,当内容过多时,就会被嵌套绕进去,写法上很不优雅. es7中的async await正是