ES6新特性使用小结(六)
十三、promise 异步编程
①、使用 promise 模拟异步操作
{ //ES5 中的 callback 解决 异步操作问题
let ajax = function (callback) {
console.log('执行');
setTimeout(function () {
callback && callback.call();
}, 1000)
};
ajax(function () {
console.log('timeout1'); // '执行' 1s 后输出 ‘timeout1’;
})
}
{ //使用Promise 模拟负责异步操作
let ajax = function () {
console.log('aaa');
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve();
}, 1000)
})
};
ajax()
.then(function () {
console.log('bbb');
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve()
}, 2000)
})
})
.then(function () {
console.log('ccc');
})
}
②、promise 异常信息捕获
{
let ajax = function (num) {
console.log('执行');
return new Promise(function (resolve, reject) {
if (num > 5) {
resolve();
} else {
throw Error('出错啦');
}
})
}
ajax(6).then(function () {
console.log('log', 6)
}).catch(function (err) {
console.log('catch', err);
});
// 执行 'log',6
ajax(3).then(function () {
console.log('log', 3)
}).catch(function (err) {
console.log('catch', err);
});
// 执行 catch Error: 出错啦
}
③、promise使用场景DEMO 所有图片加载完毕后在添加到页面
/*
* Promise.all 方法
* 把多个Promise 实例 当成一个 Promise 实例
* 当所有的 Promise 实例状态发生改变的时候 ,新的Promise才会跟着发生变化
* */
{
function loadImg(src) {
return new Promise((resolve, reject) => {
let img = document.createElement('img');
img.src = src;
img.onload= function () {
resolve(img);
};
img.onerror= function () {
reject(err)
}
})
}
function showImgs (imgs){ //三张图片作为一个实例
imgs.forEach(img=>document.body.appendChild(img))
}
Promise.all([
loadImg('https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3380917023,2961192652&fm=27&gp=0.jpg'),
loadImg('https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3380917023,2961192652&fm=27&gp=1.jpg'),
loadImg('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1506432814385&di=26b606406cd0c7f50bac0c11c0d1a561&imgtype=0&src=http%3A%2F%2Fimg4.duitang.com%2Fuploads%2Fitem%2F201602%2F01%2F20160201065848_RUYHk.thumb.700_0.jpeg')
]).then(showImgs)
/*
* 三张图片所以的状态发生改变后,才会触发 Promise.all 返回一个实例触发 .then
* */
}
④、promise 使用场景二 三张图片同时加载 ,只要有一个图片加载完就添加到页面
/*
* Promise.race 方法
* 在多个实例中,有一个状态率先改变,race实例也会发生改变,其他的实例就不再响应
* */
{
function loadImg(src) {
return new Promise((resolve, reject) => {
let img = document.createElement('img');
img.src = src;
img.onload= function () {
resolve(img);
};
img.onerror= function () {
reject(err)
}
})
}
function showImg(img){
let p = document.createElement('p');
p.appendChild(img);
document.body.appendChild(p);
}
Promise.race([
loadImg('https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3380917023,2961192652&fm=27&gp=0.jpg'),
loadImg('https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3380917023,2961192652&fm=27&gp=1.jpg'),
loadImg('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1506432814385&di=26b606406cd0c7f50bac0c11c0d1a561&imgtype=0&src=http%3A%2F%2Fimg4.duitang.com%2Fuploads%2Fitem%2F201602%2F01%2F20160201065848_RUYHk.thumb.700_0.jpeg')
]).then(showImg)
}
ES6新特性使用小结(六)的更多相关文章
- ES6新特性使用小结(三)
九.数据类型 Symbol /* * Symbol 数据类型 概念: Symbol 提供一个独一无二的值 * */ { let a1 = Symbol(); let a2 = Symbol(); co ...
- ES6新特性使用小结(二)
六.Array 扩展 /* * Array Api Array.of 数组的构建 * */ { let arr = Array.of(, , , , , ); console.log(arr); // ...
- ES6新特性使用小结(四)
十一.Proxy .Reflect ①.Proxy 的概念和常用方法 { let obj = { //1.定义原始数据对象 对用户不可见 time: '2017-09-20', name: 'net' ...
- ES6新特性使用小结(一)
一.let const 命令 'use strict'; /*function test(){ //let a = 1; for(let i=1;i<3;i++){ console.log(i) ...
- ES6新特性使用小结(五)
十二.class 与 extends ①.类的基本定义和生成实例 { class Parent{ constructor(name='Lain'){ //定义构造函数 this.name = name ...
- ES6新特性概览
本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...
- ES6新特性之模板字符串
ES6新特性概览 http://www.cnblogs.com/Wayou/p/es6_new_features.html 深入浅出ES6(四):模板字符串 http://www.infoq.c ...
- Atitit js版本es5 es6新特性
Atitit js版本es5 es6新特性 Es5( es5 其实就是adobe action script的标准化)1 es6新特性1 Es5( es5 其实就是adobe action scrip ...
- ES6新特性:Proxy代理器
ES6新特性:Proxy: 要使用的话, 直接在浏览器中执行即可, node和babel目前还没有Proxy的polyfill;,要使用的话,直接在浏览器中运行就好了, 浏览器的兼容性为:chrome ...
随机推荐
- js动态插入标签代码(insertAdjacentHTML)
做网页时通过ajax请求获取到数据后,有的需要把数据拼接到带有各种标签的字符串中,拼接完字符串就需要把字符串动态添加到网页上的某个位置,举个
- Compiling: main.cpp /bin/sh: g++: not found
Kbuntu用codeblocks编写C程序的时候,编译报错如下: Compiling: main.cpp/bin/sh: g++: not found 解决方法: sudo apt-get inst ...
- LNMP搭建随笔
LNMP(即Linux+Nginx+MYSQL+PHP)是目前非常热门的动态网站部署架构,一般是指: Linux:如RHEL.Centos.Debian.Fedora.Ubuntu等系统. Nginx ...
- win8、win10下卸载程序报错误2502、2503的解决办法
首先打开任务管理器,可以通过右键点击桌面上的任务栏打开任务管理器,也可以通过同时按下键盘上的Ctrl+Alt+Delete键打开任务管理器. 打开任务管理器后,切换到“详细信息”选项卡,找到explo ...
- 「UVA1636」Headshot(概率
题意翻译 你有一把枪(左轮的),你随机装了一些子弹,你开了一枪,发现没有子弹,你希望下一枪也没有子弹,你是应该直接开一枪(输出"SHOOT"),还是先转一下,再开一枪(输出&quo ...
- SQL 优化总结(二) 索引
索引 1.索引的建立 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的:合理的索引设计要建立在对各种查询的分析和预测上. 一般来说: (1) 有大量重复值.且经常有范围查询(between, ...
- IHE-PIX 备注
IHE给出了各个Actor之间如何通讯的建议: 1. 应用程序通讯时必须用MLLP包装或者解析. 2. 客户端建立连接后,服务器端必须用此连接进行应答.客户端可以继续用此连接启 ...
- Oracle中的float类型字段
Oracle中的float类型对应着C#中的decimal类型
- xml约束(转)
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束. 常用的约束技术XML DTD :XML Schema. XML Schema 也是一种用于定义和描述 XML 文档 ...
- eclipse修改workspace
Eclipse是一款很强的Java IDE,我们在开始的时候,往往设定了默认的workspace,当用久在之后,我们可能要去更改一下workspace的位置,但是在启动的时候已经不会显示更改了.下面有 ...