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( ...
随机推荐
- vue版 文件下载
标签的download: 是HTML5标准新增的属性,作用是指示浏览器下载URL而不是导航到URL,因此将提示用户将其保存为本地文件. 这种是定义的接口不是下载文件的路径,而是通过API可以获得文件的 ...
- 开发快平台(M302I小e开发板系列教程)
开发快平台(M302I小e开发板系列教程) 开发块平台ESP8266模块相关理解 一. M302I小e开发板源码注释,源码基于:v1.4.0.8-u34.zip 1. user_main.c /*** ...
- OO第9-11作业总结
一. 规格化设计 规格化抽象,即将执行的细节抽象为用户所需求的行为(模块做什么). 主要作用在于提高工程设计中的可维护性,可读性,明确功能,使整个编程任务变得清晰有序以减少程序BUG. 说其发展历 ...
- Mac 系统搭建ThinkPHP3.2
PHP3.2完整包目录 拷贝两个文件 index.php 和ThinkPHP目录到服务器目录中,我已经设置服务器目录与eclipse工作空间为同一个 创建TestThinkPHP 项目 Eclipse ...
- Python从入门到精通之Sixth!
补充:enumerate 函数用于遍历序列(元组tuple.列表list.字典dict)中的元素以及它们的下标: >>> for i,j in enumerate(('a','b', ...
- MUI中超链接失效解决办法
重新绑定a标签点击事件,用 plus.runtime.openURL(this.href) 打开新页面
- select、poll、epoll
1.概念 select.poll.epoll都是事件触发机制,当等待的事件发生就触发进行处理,用于I/O复用 2.简单例子理解 3.select函数 3.1函数详解 int select(int ma ...
- HDU 6348 序列计数 (树状数组 + DP)
序列计数 Time Limit: 4500/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- WebApi零碎总结
1.如果Content-Type是application/json,而POST和PUT的参数是[FromBody] string value,那么如果curl -d的值是'{"Name&qu ...
- linux 硬盘
df -hT 查看格式 各种文件 mount命令 可以挂载那些块设备:光盘.磁盘分区.U盘 光盘:文件系统:iso9660 iso文件文件系统:iso9660 iso文件可以进行挂载的 mount c ...