//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. bzoj2679: [Usaco2012 Open]Balanced Cow Subsets(折半搜索)

    2679: [Usaco2012 Open]Balanced Cow Subsets Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 462  Solv ...

  2. justify-content属性

    justify-content 用于设置或检索弹性盒子元素在主轴方向上的对齐方式. 属性值:flex-start 属性值:flex-end 属性值:center 属性值:space-between 属 ...

  3. mysql 的索引hash和b+tree 区别

    索引hash相当于数组,键值对组合,对于id = 6或者status= 2这样条件查询,但是对于id>12等这样,用btree索引最好.

  4. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 Overlapping Rectangles

    There are nn rectangles on the plane. The problem is to find the area of the union of these rectangl ...

  5. Hbase源码分析:RPC概况

    RPC是hbase中Master,RegionServer和Client三者之间通信交流的纽带.了解hbase的rpc机制能够为通过源码学习hbase奠定良好的基础.因为了解了hbase的rpc机制能 ...

  6. Java内存模型原理,你真的理解吗?

    [51CTO.com原创稿件]这篇文章主要介绍模型产生的问题背景,解决的问题,处理思路,相关实现规则,环环相扣,希望读者看完这篇文章后能对 Java 内存模型体系产生一个相对清晰的理解,知其然知其所以 ...

  7. P1160 队列安排

    题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进队列,这时队列中只有他一个人: 2.2-N号同学依次入列,编号为i的同学入列方式为:老师 ...

  8. Linux系统调用--getrusage函数详解

    Linux系统调用--getrusage函数详解 功能描述:     获得进程的相关资源信息.如:用户开销时间,系统开销时间,接收的信号量等等;   用法:    #include <sys/t ...

  9. Ajax异步刷新省市级联

    省市级联在web前端用户注册使用非常广泛.Ajax异步刷新省市级联.如图:选择不同的区,自动加载相应的街. <TD class=field>位 置:</TD> <TD&g ...

  10. mysqlbinlog flashback 使用最佳实践

    mysqlbinlog限制 该软件利用binlog中记录了操作前的数据镜像和操作后的数据镜像.有如下限制 1)binlog_format=row 2)必须打开binlog 3)只支持insert.up ...