十三、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新特性使用小结(六)的更多相关文章

  1. ES6新特性使用小结(三)

    九.数据类型 Symbol /* * Symbol 数据类型 概念: Symbol 提供一个独一无二的值 * */ { let a1 = Symbol(); let a2 = Symbol(); co ...

  2. ES6新特性使用小结(二)

    六.Array 扩展 /* * Array Api Array.of 数组的构建 * */ { let arr = Array.of(, , , , , ); console.log(arr); // ...

  3. ES6新特性使用小结(四)

    十一.Proxy .Reflect ①.Proxy 的概念和常用方法 { let obj = { //1.定义原始数据对象 对用户不可见 time: '2017-09-20', name: 'net' ...

  4. ES6新特性使用小结(一)

    一.let const 命令 'use strict'; /*function test(){ //let a = 1; for(let i=1;i<3;i++){ console.log(i) ...

  5. ES6新特性使用小结(五)

    十二.class 与 extends ①.类的基本定义和生成实例 { class Parent{ constructor(name='Lain'){ //定义构造函数 this.name = name ...

  6. ES6新特性概览

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

  7. ES6新特性之模板字符串

    ES6新特性概览  http://www.cnblogs.com/Wayou/p/es6_new_features.html 深入浅出ES6(四):模板字符串   http://www.infoq.c ...

  8. Atitit js版本es5 es6新特性

    Atitit js版本es5 es6新特性 Es5( es5 其实就是adobe action script的标准化)1 es6新特性1 Es5( es5 其实就是adobe action scrip ...

  9. ES6新特性:Proxy代理器

    ES6新特性:Proxy: 要使用的话, 直接在浏览器中执行即可, node和babel目前还没有Proxy的polyfill;,要使用的话,直接在浏览器中运行就好了, 浏览器的兼容性为:chrome ...

随机推荐

  1. js动态插入标签代码(insertAdjacentHTML)

    做网页时通过ajax请求获取到数据后,有的需要把数据拼接到带有各种标签的字符串中,拼接完字符串就需要把字符串动态添加到网页上的某个位置,举个

  2. Compiling: main.cpp /bin/sh: g++: not found

    Kbuntu用codeblocks编写C程序的时候,编译报错如下: Compiling: main.cpp/bin/sh: g++: not found 解决方法: sudo apt-get inst ...

  3. LNMP搭建随笔

    LNMP(即Linux+Nginx+MYSQL+PHP)是目前非常热门的动态网站部署架构,一般是指: Linux:如RHEL.Centos.Debian.Fedora.Ubuntu等系统. Nginx ...

  4. win8、win10下卸载程序报错误2502、2503的解决办法

    首先打开任务管理器,可以通过右键点击桌面上的任务栏打开任务管理器,也可以通过同时按下键盘上的Ctrl+Alt+Delete键打开任务管理器. 打开任务管理器后,切换到“详细信息”选项卡,找到explo ...

  5. 「UVA1636」Headshot(概率

    题意翻译 你有一把枪(左轮的),你随机装了一些子弹,你开了一枪,发现没有子弹,你希望下一枪也没有子弹,你是应该直接开一枪(输出"SHOOT"),还是先转一下,再开一枪(输出&quo ...

  6. SQL 优化总结(二) 索引

     索引 1.索引的建立 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的:合理的索引设计要建立在对各种查询的分析和预测上. 一般来说: (1) 有大量重复值.且经常有范围查询(between, ...

  7. IHE-PIX 备注

    IHE给出了各个Actor之间如何通讯的建议: 1.       应用程序通讯时必须用MLLP包装或者解析. 2.       客户端建立连接后,服务器端必须用此连接进行应答.客户端可以继续用此连接启 ...

  8. Oracle中的float类型字段

    Oracle中的float类型对应着C#中的decimal类型

  9. xml约束(转)

    在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束. 常用的约束技术XML DTD :XML Schema. XML Schema 也是一种用于定义和描述 XML 文档 ...

  10. eclipse修改workspace

    Eclipse是一款很强的Java IDE,我们在开始的时候,往往设定了默认的workspace,当用久在之后,我们可能要去更改一下workspace的位置,但是在启动的时候已经不会显示更改了.下面有 ...