十三、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. 一篇文章教你如何用R进行数据挖掘

    一篇文章教你如何用R进行数据挖掘 引言 R是一种广泛用于数据分析和统计计算的强大语言,于上世纪90年代开始发展起来.得益于全世界众多 爱好者的无尽努力,大家继而开发出了一种基于R但优于R基本文本编辑器 ...

  2. jQuery+CSS3实现弯曲文字路径

    jQuery+CSS3实现弯曲文字路径,jQuery,CSS3特效,弯曲文字,文字,文字特效,环形文字. 源码下载:http://www.huiyi8.com/sc/6281.html

  3. ZOJ 3805 Machine(二叉树,递归)

    题意:一颗二叉树,求  “  宽度  ” 思路:递归,貌似这个思路是对的,先记下,但是提交时超时, 1.如果当前节点只有左孩子,那么当前宽度等于左孩子宽度 2.如果当前节点只有右孩子,那么当前宽度等于 ...

  4. Meta viewport 学习整理

    The meta viewport tag contains instructions to the browser in the matter of viewports and zooming. I ...

  5. webAPP meta 标签大全

    1.先说说mate标签里的viewport: viewport即可视区域,对于桌面浏览器而言,viewport指的就是除去所有工具栏.状态栏.滚动条等等之后用于看网页的区域.对于传统WEB页面来说,9 ...

  6. algo: 冒泡排序(Java实现)

    package com.liuxian.algo; public class MySortClass implements Comparable<MySortClass> { public ...

  7. 再学IHanlder 类----------------关于Asp.net与iis原理网上看博客收获写一个验证码用一般处理程序记的好长时间前就写过不过现在再看有点不一样的感觉

    建一个web网站 新建一般处理程序直接贴代码: using System;using System.Collections.Generic;using System.Linq;using System ...

  8. HashMap的clear方法

    我们都知道HashMap的clear()方法会清楚map的映射关系,至于怎么实现的呢? 下面先看一下clear()方法的源码 public void clear() { Node<K,V> ...

  9. 3-C++程序的结构1.5

    多文件结构和编译预处理命令 1.c++程序的一般组织结构 通常一个项目至少划分为三个文件:类定义文件(*.h文件).类实现文件(*.cpp文件)和类的使用文件(*.cpp,主函数文件).如下: 这三个 ...

  10. Hibernate的auto-import属性详解

    auto-import是什么意思呢? 我们经常会写这样一个HQL语句: from User u where u.name='罗灿锋'; 绝大多数时候,这样写是不会发生问题的. hibernate在处理 ...