之前多次看过阮一峰的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的基本用法的更多相关文章

  1. ES6语法 promise用法

    ES6语法 promise用法 function doSomething(){ return new Promise((resolve,reject)=>{ resolve('jjjj');// ...

  2. ES6之Promise用法详解

    一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...

  3. es6的promise用法详解

    es6的promise用法详解 promise 原理 promise是es6的异步编程解决方案, 是es6封装好的对象: 一个promise有三种状态:Pending(进行中).Resolved(已完 ...

  4. ES6 - promise对象

    Promise的设计初衷 我们使用ajax请求数据,得到数据后再对数据进行操作,可是有时候,对得到的数据进行操作的过程中,可能又要用到ajax请求,这时,我们的代码就变成了这样: $.ajax({ s ...

  5. 一个简单的例子搞懂ES6之Promise

    ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步 ...

  6. Promise的简单用法

    众所周知的,Javascript是一种单线程的语言,所有的代码必须按照所谓的“自上而下”的顺序来执行.本特性带来的问题就是,一些将来的.未知的操作,必须异步实现.本文将讨论一个比较常见的异步解决方案— ...

  7. 深入浅出:promise的各种用法

    https://mp.weixin.qq.com/s?__biz=MzAwNTAzMjcxNg==&mid=2651425195&idx=1&sn=eed6bea35323c7 ...

  8. ES6中promise总结

    一.什么是ES6的Promise 讲太多也没有.直接在打印出来就好,console.dir(Promise) Promise 是一个构造函数,自身有all, reject, resolve 这几个眼熟 ...

  9. ES6新增"Promise"可避免回调地狱

    Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...

随机推荐

  1. ajax 与jsp servlet

    jQuery的Ajax实现异步传输List.Map_GOOD 分类: JAVA WEB前端2013-08-29 18:35 6296人阅读 评论(0) 收藏 举报 javajquerylistjson ...

  2. Finish final project

    一.项目地址:https://github.com/Joyce45/final-project 二.团队成员陈述: 于浩: 张雨: 遇到的问题:1.通过relativepanel解决了刚开始设计上使用 ...

  3. linux sort排序命令的高级用法(按多个列值进行排列)

    http://www.jquerycn.cn/a_9076 在linux中,使用sort按行进行排序是很简单的.不过有时,生活总是爱抛给你一个一个的问题.如果使用sort按多个列值排列,同时使用tab ...

  4. Django模板继承和引用

    一.模板继承 1.模板继承可以在创建一个基本“骨架”后,被其它子模板继承并覆盖,通过修改基础模板可以修改子模板中的所有框架 2.在模板teacher文件夹下创建基础模板 {% block xxx}与{ ...

  5. fastjson 序列化,反序列化Map对象的顺序问题

    使用JSONObject  读取JSON字符串时,读取出来的数据,通过变量时是无序的. 但是业务希望返回是顺序的. String str="{name:\"A\",add ...

  6. Educational Codeforces Round 58 (Rated for Div. 2) G 线性基

    https://codeforces.com/contest/1101/problem/G 题意 一个有n个数字的数组a[],将区间分成尽可能多段,使得段之间的相互组合异或和不等于零 题解 根据线性基 ...

  7. 实践中 XunSearch(讯搜)更新索引方案对比

    检测PHP-SDK的运行条件(查看是否支持XunSearch)   $prefix/sdk/php/util/RequiredCheck.php $prefix #替换成你的安装目录 使用 XunSe ...

  8. Servlet映射

    转载自https://blog.csdn.net/xinluke/article/details/51449594 映射请求到Servlet |-- Context Path --|-- Servle ...

  9. linux dhcp 简单配置

    dhcp 端口 UDP67和UDP68为正常的DHCP服务端口 rpm -qa | grep dhcp 查询是否安装了dhcp 服务 安装dhcp 服务 yum install dhcp -y 打开/ ...

  10. Shell输入和输出功能-3