//1.解决异步回调问题
//1.1 如何同步异步请求
//如果几个异步操作之间并没有前后顺序之分,但需要等多个异步操作都完成后才能执行后续的任务,无法实现并行节约时间 const fs = require('fs');
let school = {};
fs.readFile('./name.txt','utf8',function (err,data) {
school.name = data;
});
fs.readFile('./age.txt','utf8',function (err,data) {
school.age = data;
});
console.log(school);
//1.2如何解决回调地狱
//在需要多个操作的时候,会导致多个回调函数嵌套,导致代码不够直观,就是常说的回调地狱 const fs = require('fs');
fs.readFile('./content.txt','utf8',function (err,data) {
if(err)console.log(err);
fs.readFile(data,'utf8',function (err,data) {
if(err)console.log(err);
console.log(data);
})
});
//2.Promise
//Promise本意是承诺,在程序中的意思就是承诺我过一段时间后会给你一个结果。 什么时候会用到过一段时间?答案是异步操作,异步是指可能比较长时间才有结果的才做,例如网络请求、读取本地文件等 //3.Promise的三种状态
//例如媳妇说想买个包,这时候他就要"等待"我的回复,我可以过两天买,如果买了表示"成功",如果我最后拒绝表示"失败",当然我也有可能一直拖一辈子 //Pending Promise对象实例创建时候的初始状态
//Fulfilled 可以理解为成功的状态
//Rejected 可以理解为失败的状态
//then 方法就是用来指定Promise 对象的状态改变时确定执行的操作,resolve 时执行第一个函数(onFulfilled),reject 时执行第二个函数(onRejected)
//4.构造一个Promise
//4.1 promise的方法会立刻执行
let promise = new Promise(()=>{
console.log('hello');
});
console.log('world');
//4.2 promise也可以代表一个未来的值
const fs = require('fs');
let promise = new Promise((resolve,reject)=>{
fs.readFile('./content.txt','utf8',function (err,data) {
if(err)console.log(err);
resolve(data);
})
});
promise.then(data =>{
console.log(data);
});
//4.3 代表一个用于不会返回的值
const fs = require('fs');
let promise = new Promise((resolve,reject)=>{});
promise.then(data =>{
console.log(data);
});
//4.4 应用状态实现抛硬币
function flip_coin() {
return new Promise((resolve,reject)=>{
setTimeout(function () {
var random = Math.random();
if(random > 0.5){
resolve('正');
}else{
resolve('反');
}
},2000)
})
}
flip_coin().then(data=>{
console.log(data);
},data=>{
console.log(data);
});
//5.实现简单的Promise
function Promise(fn) {
fn((data)=>{
this.resolve(data) },(data)=>{
this.reject(data);
})
}
Promise.prototype.resolve = function (data) {
this._success(data)
};
Promise.prototype.reject = function (data) {
this._error(data);
};
Promise.prototype.then = function (success,error) {
this._success = success;
this._error = error;
};
//6.Error会导致触发Reject
//可以采用then的第二个参数捕获失败,也可以通过catch函数进行捕获 function flip_coin() {
return new Promise((resolve,reject)=>{
throw Error('没有硬币')
})
}
flip_coin().then(data=>{
console.log(data);
}).catch((e)=>{
console.log(e);
})
//7.Promise.all实现并行
//接受一个数组,数组内都是Promise实例,返回一个Promise实例,这个Promise实例的状态转移取决于参数的Promise实例的状态变化。当参数中所有的实例都处于resolve状态时,返回的Promise实例会变为resolve状态。如果参数中任意一个实例处于reject状态,返回的Promise实例变为reject状态 const fs = require('fs');
let p1 = new Promise((resolve,reject)=>{
fs.readFile('./name.txt','utf8',function (err,data) {
resolve(data);
});
})
let p2 = new Promise((resolve,reject)=>{
fs.redFile('./age.txt','utf8',function (err,data) {
resolve(data);
});
})
Promise.all([p1,p2]).then(([res1,res2])=>{
console.log(res1);
})
//不管两个promise谁先完成,Promise.all 方法会按照数组里面的顺序将结果返回
//8.Promise.race实现选择接受一个数组,数组内都是Promise实例,返回一个Promise实例,这个Promise实例的状态转移取决于参数的Promise实例的状态变化。当参数中任何一个实例处于resolve状态时,返回的Promise实例会变为resolve状态。如果参数中任意一个实例处于reject状态,返回的Promise实例变为reject状态。 const fs = require('fs');
let p1 = new Promise((resolve,reject)=>{
fs.readFile('./name.txt','utf8',function (err,data) {
resolve(data);
});
})
let p2 = new Promise((resolve,reject)=>{
fs.readFile('./age.txt','utf8',function (err,data) {
resolve(data);
});
})
Promise.race([p1,p2]).then(([res1,res2])=>{
console.log(res1,res2);
})
9.Promise.resolve
//返回一个Promise实例,这个实例处于resolve状态。 Promise.resolve('成功').then(data=>{
console.log(data);
})
10.Promise.reject
//返回一个Promise实例,这个实例处于reject状态 Promise.reject('失败').then(data=>{
console.log(data);
},re=>{
console.log(re);
})
//11.封装ajax
function ajax({url=new Error('url必须提供'),method='GET',async=true,dataType='json'}){
return new Promise(function(resolve,reject){
var xhr = new XMLHttpRequest();
xhr.open(method,url,async);
xhr.responseType = dataType;
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(/^2\d{2}/.test(xhr.status)){
resolve(xhr.response);
}else{
reject(xhr.response);
}
}
}
xhr.send();
});
}
//12.chain中返回结果
Promise.resolve([1,2,3])
.then(arr=>{
return [...arr,4]
}).then(arr=>{
return [...arr,5]
}).then(arr=>{
console.log(arr);
})
//13.chain中返回promise
//then中的结果是promise的resolve后的结果 Promise.resolve('user').then(data=>{
return new Promise(function (resolve,reject) {
fetch('/'+data).then(res=>res.json().then((json)=>{
resolve(json)
}))
})
}).then(data=>{
console.log(data);
});
//改写的更简单些 Promise.resolve('user').then(data=>{
return fetch('/'+data)
}).then(res=>{
return res.json();
}).then(data=>{
console.log(data);
})
//14.async/await
//本质是语法糖,await与async要连用,await后只能跟promise async function getHello() {
return new Promise((resolve,reject) => {
setTimeout(function () {
resolve('hello');
},2000);
})
}
async function getData () {
var result = await getHello();
console.log(result);
} ;
getData();

Promise 异步编程的更多相关文章

  1. ES6笔记(7)-- Promise异步编程

    系列文章 -- ES6笔记系列 很久很久以前,在做Node.js聊天室,使用MongoDB数据服务的时候就遇到了多重回调嵌套导致代码混乱的问题. JS异步编程有利有弊,Promise的出现,改善了这一 ...

  2. promise异步编程的原理

    一.起源 JavaScript中的异步由来已久,不论是定时函数,事件处理函数还是ajax异步加载都是异步编程的一种形式,我们现在以nodejs中异步读取文件为例来编写一个传统意义的异步函数: var ...

  3. async/await actor promise 异步编程

    Python协程:从yield/send到async/await http://blog.guoyb.com/2016/07/03/python-coroutine/ Async/Await替代Pro ...

  4. Promise异步编程解决方案

    Promise是ES6中新增的异步编程解决方案,体现在代码中它是一个对象,可以通过 Promise 构造函数来实例化. 其最基本的使用 new Promise(function(resolve,rej ...

  5. ES6入门八:Promise异步编程与模拟实现源码

    Promise的基本使用入门: ——实例化promise对象与注册回调 ——宏任务与微任务的执行顺序 ——then方法的链式调用与抛出错误(throw new Error) ——链式调用的返回值与传值 ...

  6. 学习Promise异步编程

    JavaScript引擎建立在单线程事件循环的概念上.单线程( Single-threaded )意味着同一时刻只能执行一段代码.所以引擎无须留意那些"可能"运行的代码.代码会被放 ...

  7. 【ES6】Generator+Promise异步编程

    一.概念 首先我们要理解Generator和Promise的概念. Generator:意思是生成器,可以在函数内部通过yeild来控制语句的执行或暂停状态. *Foo(){ yeild consol ...

  8. Promise异步编程整理

    1.单线程模型 单线程模型指的是,JavaScript 只在一个线程上运行.也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待. 注意,JavaScript 只在一个线 ...

  9. 张鑫旭:Promise异步编程模式

    参考文章: http://www.zhangxinxu.com/wordpress/2014/02/es6-javascript-promise-%E6%84%9F%E6%80%A7%E8%AE%A4 ...

随机推荐

  1. SQL 理论知识总结

    1..如何设计数据库 答:存储信息的大小,每次扩容的大小,冗余 2.SQL Server的两种索引是何形式?索引的作用?索引的优缺点? 答:集聚索引,非聚集索引.提高查询速度.但是会过多的占用磁盘空间 ...

  2. 树形DP Gym 100496H House of Representatives

    题目传送门 /* 题意:寻找一个根节点,求min f(u) = ∑ρ(v, u) * p(v).ρ(v, u)是u到v的距离,p(v)是v点的权值 树形DP:先从1出发遍历第一次,sum[u]计算u到 ...

  3. vue+elementUI table篇

    1.table内容展示 <el-table stripe :key='tableKey' header-cell-class-name="bindonce" :data=&q ...

  4. maven build过程中遇到的问题以及解决方案

    (1)不支持泛型以及@Override 问题来源:使用了低版本的jdk,默认情况下maven使用的是jdk1.5的版本,而泛型和@Override是后期版本才有的,需要更改maven默认的jdk版本. ...

  5. (1)指针、引用、const限定符

    自己看书时的一些理解,可能有错误的地方.随着指针的使用增多,会不断修改这篇文章的内容,过去错误的会用划线划去后保留. 1.对引用.指针.常量引用.指向常量的指针.常量指针的理解 //对引用.指针.常量 ...

  6. 联想 Vibe Shot(Z90-3) 免recovery 获取ROOT权限 救砖 VIBEUI V3.1_1625

    >>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后用 ...

  7. Linux 学习(二)

    Linux相关命令 命令 说明 startx 当前用户界面切换至图形界面 init5 切换至另一用户的图形化界面 init3 从图形界面切换回文本界面 pwd 显示当前用户路径 logout 注销 s ...

  8. Sturts2几个常用内建拦截器的介绍

    Sturts2几个常用内建拦截器的介绍:1)conversation:这是一个处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action的FieldErro ...

  9. Docker方式安装QIIME 2

    # 下载最新版QIIME 2 docker pull qiime2/core:2017.7 # 测试是否安装成功 docker run -t -i -v $(pwd):/mnt/hgfs/2017 q ...

  10. java内存组成

     java内存组成介绍:堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动 ...