Promise 异步编程
//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 异步编程的更多相关文章
- ES6笔记(7)-- Promise异步编程
系列文章 -- ES6笔记系列 很久很久以前,在做Node.js聊天室,使用MongoDB数据服务的时候就遇到了多重回调嵌套导致代码混乱的问题. JS异步编程有利有弊,Promise的出现,改善了这一 ...
- promise异步编程的原理
一.起源 JavaScript中的异步由来已久,不论是定时函数,事件处理函数还是ajax异步加载都是异步编程的一种形式,我们现在以nodejs中异步读取文件为例来编写一个传统意义的异步函数: var ...
- async/await actor promise 异步编程
Python协程:从yield/send到async/await http://blog.guoyb.com/2016/07/03/python-coroutine/ Async/Await替代Pro ...
- Promise异步编程解决方案
Promise是ES6中新增的异步编程解决方案,体现在代码中它是一个对象,可以通过 Promise 构造函数来实例化. 其最基本的使用 new Promise(function(resolve,rej ...
- ES6入门八:Promise异步编程与模拟实现源码
Promise的基本使用入门: ——实例化promise对象与注册回调 ——宏任务与微任务的执行顺序 ——then方法的链式调用与抛出错误(throw new Error) ——链式调用的返回值与传值 ...
- 学习Promise异步编程
JavaScript引擎建立在单线程事件循环的概念上.单线程( Single-threaded )意味着同一时刻只能执行一段代码.所以引擎无须留意那些"可能"运行的代码.代码会被放 ...
- 【ES6】Generator+Promise异步编程
一.概念 首先我们要理解Generator和Promise的概念. Generator:意思是生成器,可以在函数内部通过yeild来控制语句的执行或暂停状态. *Foo(){ yeild consol ...
- Promise异步编程整理
1.单线程模型 单线程模型指的是,JavaScript 只在一个线程上运行.也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待. 注意,JavaScript 只在一个线 ...
- 张鑫旭:Promise异步编程模式
参考文章: http://www.zhangxinxu.com/wordpress/2014/02/es6-javascript-promise-%E6%84%9F%E6%80%A7%E8%AE%A4 ...
随机推荐
- P4244 [SHOI2008]仙人掌图 II
传送门 仙人掌直径,以前好像模拟赛的时候做到过一道基环树的直径,打了个很麻烦的然而还错了--今天才发现那就是这个的弱化版啊-- 如果是树的话用普通的dp即可,记\(f[u]\)表示\(u\)往下最长能 ...
- [Swift通天遁地]一、超级工具-(9)在地图视图MKMapView中添加支持交互动作的标注图标
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- (数论)51NOD 1135 原根
设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根.(其中φ(m)表示m的欧拉函数) 给出1个质数P,找出P最小的原根. Input 输入1个质数P(3 <= P &l ...
- 【第三届强网杯】write up
一,鲲or鳗orGame 从浏览器里拿到game.gb 用 VisualBoyAdvance ,搜索内存变量,然后改变量就完事了,但是改变量他们说直接利用添加代码功能有bug,所以要在工具里的内存查看 ...
- python自动化测试学习笔记-unittest参数化
做接口测试的时候,当一个参数需要输入多个值的时候,就可以使用参数来实现: python中unittest单元测试,可以使用nose_parameterized来实现: 首先需要安装:pip inst ...
- 生成 Guid
//生成Guid function getGuidGenerator() { var S4 = function () { return (((1 + Mat ...
- 51nod 1166 大数开平方
1166 大数开平方 基准时间限制:4 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 给出一个大整数N,求不大于N的平方根的最大整数.例如:N = 8,2 * 2 ...
- Android 性能优化(25)*性能工具之「Systrace」Analyzing UI Performance with Systrace:用Systrace得到ui性能报告
Analyzing UI Performance with Systrace In this document Overview 简介 Generating a Trace 生成Systrace文件 ...
- ASP.NET 简介(转自Wiki)
ASP.NET是由微软在.NET Framework框架中所提供,开发Web应用程序的类库,封装在System.Web.dll文件中,显露出System.Web名字空间,并提供ASP.NET网页处理. ...
- 【转载】tomcat部署web项目的3中方法
转载自:http://blog.csdn.net/wjx85840948/article/details/6749964/ 1.直接把项目复制到Tomcat安装目录的webapps目录中,这是最简单的 ...