ES6之Promise的基本用法
之前多次看过阮一峰的ES6教程,对Promise也简单的理解过,但是,由于没在项目中运用过,所以记忆的并不深刻,昨天在进行项目的改良,有一个地方需要用到Promise
所以就这样写了:
onload函数,是向后台请求数据的异步函数,
this.number是通过onload函数得到的,
运行起来老是会出现这样那样的问题
后来竟然指出,原来是我的Promise函数写错了
resolve应该传给onload函数,在它的异步成功之后,再resolve();
经过一番更改之后,果然就好了。,
贴一张图;
一个简单的例子,getTime()为异步函数,
此时的执行顺序为,
延迟3秒之后,输出:
延迟3秒执行
1
执行then函数
-----------------------------------------------------------2018-06-04-------------------------------------------------------------------------
回调函数把上一个then中返回的值当作参数值提供给当前的then方法调用
then方法执行完毕后需要返回一个新的值给下一个then调用(没有返回值默认使用undefined)
每一个then只能使用前一个then的返回值
若then中传的不是函数,则必须被忽略
function isAsync1(){
var p = new Promise(function(resolve,reject){
setTimeout(function(){
console.log('isAsync1数据')
resolve('isAsync1函数')
},1000)
})
return p
}
function isAsync2(){
var p = new Promise(function(resolve,reject){
setTimeout(function(){
console.log('isAsync2数据')
resolve('isAsync2函数')
},1000)
})
return p
}
function isAsync3(){
var p = new Promise(function(resolve,reject){
setTimeout(function(){
console.log('isAsync3数据')
resolve('isAsync3函数')
},1000)
})
return p
}
isAsync1()
.then(function(data){
console.log(data)
return isAsync2()
})
.then(function(data){
console.log(data)
return isAsync3()
})
.then(function(data){
console.log(data)
})
reject的用法
function getNumber(){
var p = new Promise(function(resolve,rejcet){
setTimeout(function(){
var num = Math.ceil(Math.random()*10);
if(num<=5){
resolve(num)
}else{
rejcet('数字太大了')
}
},1000)
})
return p;
}
getNumber()
.then(
function(data){
console.log('resolved')
console.log(data)
},
function(reason,data){
console.log('rejected')
console.log(reason)
}
)
会得到下面两种情况
catch
function getNumber(){
var p = new Promise(function(resolve,rejcet){
setTimeout(function(){
var num = Math.ceil(Math.random()*10);
if(num<=5){
resolve(num)
}else{
rejcet('数字太大了')
}
},1000)
})
return p;
}
getNumber()
.then(function(data){
console.log('resolved')
console.log(data)
}
)
.catch(function(reason,data){
console.log('rejected')
console.log(reason)
})
catch还有另外一个作用:在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会
报错卡死js,而是会进到这个catch方法中。
all的用法
Promise的all方法提供了并行操作执行异步操作的能力,并且在所有异步操作执行完后才执行回调。仍以定义的3个函数
Promise.all([isAsync1(),isAsync2(),isAsync3()])
.then(function(results){
console.log(results)
})
race的用法
all方法的效果实际上是【谁跑的慢,以谁为准执行回调】,那么相对的就有一个方法【谁跑得快,以谁为准执行回调】
Promise.race([isAsync1(),isAsync2(),isAsync3()])
.then(function(results){
console.log(results)
})
在then里面的回调开始执行时,isAsync2和isAsync3并没有停止,仍旧在执行。
ES6之Promise的基本用法的更多相关文章
- ES6语法 promise用法
ES6语法 promise用法 function doSomething(){ return new Promise((resolve,reject)=>{ resolve('jjjj');// ...
- ES6之Promise用法详解
一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...
- es6的promise用法详解
es6的promise用法详解 promise 原理 promise是es6的异步编程解决方案, 是es6封装好的对象: 一个promise有三种状态:Pending(进行中).Resolved(已完 ...
- ES6 - promise对象
Promise的设计初衷 我们使用ajax请求数据,得到数据后再对数据进行操作,可是有时候,对得到的数据进行操作的过程中,可能又要用到ajax请求,这时,我们的代码就变成了这样: $.ajax({ s ...
- 一个简单的例子搞懂ES6之Promise
ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步 ...
- Promise的简单用法
众所周知的,Javascript是一种单线程的语言,所有的代码必须按照所谓的“自上而下”的顺序来执行.本特性带来的问题就是,一些将来的.未知的操作,必须异步实现.本文将讨论一个比较常见的异步解决方案— ...
- 深入浅出:promise的各种用法
https://mp.weixin.qq.com/s?__biz=MzAwNTAzMjcxNg==&mid=2651425195&idx=1&sn=eed6bea35323c7 ...
- ES6中promise总结
一.什么是ES6的Promise 讲太多也没有.直接在打印出来就好,console.dir(Promise) Promise 是一个构造函数,自身有all, reject, resolve 这几个眼熟 ...
- ES6新增"Promise"可避免回调地狱
Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...
随机推荐
- angularJs 2-quickstart学习记录
angular官网文档 我尝试文档中下载<快速起步>种子的方法进行quickstart. cd quickstart npm install npm start npm install 这 ...
- IntelliJ IDEA2017 + tomcat 即改即生效 实现热部署
https://www.cnblogs.com/1024zy/p/6344000.html
- linux系统下部署DNS反向解析
DNS服务概述 DNS(Domain Name System)域名系统,能够提供域名与IP地址的解析服务. 反向解析 反向解析是从IP地址到域名的解析过程.主要作用于服务器的身份验证. 部署反向解析 ...
- xpath json操作符说明
XPath JSONPath Description / $ the root object/element . @ the current object/element / . or [] chil ...
- 《Linux就该这么学》第十天课程
使用RAID与LVM磁盘阵列技术 有RAID 0,RAID 1,,RAID 5,RAID 1 0等,下面列举RAID的各个概况 1. RAID 0 RAID 0技术把多块物理硬盘设备(至少两块)通过硬 ...
- sql语句创建数据表
unsigned 数值类型 无符号化 AUTO_INCREMENT 自增长 PRIMARY KEY 唯一主键 COMMENT 备注信息 BIT 类型只有1和0两个值 enum 枚举数值类型 UNIQU ...
- Linux环境(Centos7)下部署.NetCore2.0的Web应用
Web应用基于Windows环境下开发,然后部署到Linux 1.进入VS2017,点击新建->项目->.NetCore->ASP.NET Core Web应用程序,确定 2.选择W ...
- idea编辑器激活码
激活方式:License Server1.将地址 http://active.chinapyg.com/ 或者 http://idea.toocruel.net 任意一个复制到License Serv ...
- Core Expression
https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm A Cron Expressions Cro ...
- 转 多租户SaaS架构
当使用Techcello框架开发云端多租户SaaS应用程序时,它继承了经过验证和测试的架构蓝图和工程结构.但开发人员仍然会保留灵活性,自由和控制权,以修改和扩展能力以适应其应用要求.此外,SaaS平台 ...