知识体系

Promise基础语法,如何处理错误,简单介绍异步函数

内容

错误处理的两种方式:

reject('错误信息').then(null, message => {})

throw new Error('错误信息').catch(message => {})

推荐第二种

4个案例promise

// 1
doSomething().then(function () {
return doSomethingElse();
}); // 2
doSomething().then(function () {
doSomethingElse();
}); // 3
doSomething().then(doSomethingElse()); // 4
doSomething().then(doSomethingElse);

.then()

状态响应函数可以返回新的Promise,或其它值

如果返回新的Promise,那么下一级.then()会在新Promise状态改变之后执行

如果返回其它任何值,则会立刻执行下一级.then()

.then()接受两个函数作为参数:

fulfilledrejected

.then()返回一个新的Promise实例,所以它可以链式调用

当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行

可以有多个then,成为队列,每个then都会返回一个新的promise实例

[外链图片转存失败(img-jXpVtXtc-1563275786816)(https://upload-images.jianshu.io/upload_images/11158618-ba6cb93c0c741859.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

promise状态

Promise状态发生改变,会触发.then()里的响应函数处理后续步骤。

Promise状态一经改变,不会再变。

promise 结构!!

new Promise(
// 执行器
function (resolve, reject) {
// 一段耗时很长的异步操作
resolve(); // 数据处理完成
reject(); // 数据处理出错
}
).then(function A() {
// 成功,下一步
}, function B() {
// 失败
});

Promise.race()

常见用法:

把异步操作和定时器放在一起

如果定时器先触发,就认为超时,告知用户

thenable就是有一个then()函数的对象

.then( value => {
console.log(value, 'World');
return Promise.resolve(new Promise( resolve => {
setTimeout(() => {
resolve('Good');
}, 2000);
}));
})
.then( value => {
console.log(value, 'evening');
return Promise.resolve({
then() {
console.log('everone');
}
})
});

Promise.all 与map

把所有文件读出之后再处理,所以用到了promise.all()

const FileSystem = require('./FileSystem');

function findLargest(dir){
return FildSystem.readDir(dir, 'utf-8')
.then( files => {
return Promise.all( files.map( file=> {
return new Promise(resolve => {
fs.stat(path.join(dir, file), (err, stat) => {
if(err) throw err;
if(stat.isDirectory()) {
return resolve({
size: 0
});
}
stat.file = file;
resolve(stat);
});
});
}));
})

Promise 释义

Promise对象用于异步计算

一个Promise表示一个现在,将来或永久不可能可用的值

主要用于异步计算

可以将异步操作队列化,按住期望的顺序执行,返回符合预期的结果

可以在对象之间传递和操作Promise,帮助我们处理队列

异步产生的原因

异步操作的常用语法:

document.getElementById('start').addEventListener('click', start, false);

function start() {
// 响应事件
} // jquery
$('#start').on('click', start);

回调:

// 比较常见的有 ajax
$.ajax('http://baidu.com', {
success: function (res) {
// 这里就是回调函数了
}
});
// 或者在页面加载完毕后回调
$(function () {
// 这里也是回调函数
});

异步操作以事件为主

回调主要出现在Ajax和File API

这个时候问题尚不算严重

异步回调的问题

遍历目录,找到最大的文件

const fs = require('fs');
const path = require('path'); function findLargest(dir, callback) {
fs.readdir(dir, function (err, files) {
if (err) return callback(err);
let count = files.length;
let errored = false;
let stats = [];
files.forEach( file => {
fs.stat(path.join(dir, file), (err, stat) => {
if(errored) return;
if(err) {
errored = true;
return callback(err);
}
stats.push(stat);

Promise 简介

new Promise(
// 执行器
function (resolve, reject) {
// 一段耗时很长的异步操作
resolve(); // 数据处理完成
reject(); // 数据处理出错
}
)
.then(function A() {
// 成功,下一步
},function B() {
// 失败,做相应处理
});

Promise是一个代理对象,它和原先要进行的操作并无关系。

它通过引入一个回调。

Promise有3个状态

pending [待定] 初始状态
fulfilled [实现] 操作成功
rejected [被否决] 操作失败

promise状态发生改变,就会触发.then()里的响应函数出来了后续步骤。

Promise状态一经改变,不会再变。

[外链图片转存失败(img-gA23f1q6-1563275786818)(https://upload-images.jianshu.io/upload_images/11158618-10641ebb84f7caa1.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

最简单的实例

定时器

new Promise( resolve => {
setTimeout( () => {
resolve('hello');
}, 2000);
})
.then( value => {
console.log( value + 'world');
});

两步执行的范例

new Promise( resolve => {
setTimeout( () => {
resolve('hello');
}, 2000);
})
.then( value => {
console.log(value);
return new Promise( resolve => {
setTimeout( () => {
resolve('world')
}, 2000);
});
})
.then(value => {
console.log(value + 'world');
});

对已完成的 Promise 执行 then

let promise = new Promise(resolve => {
setTimeout(() => {
console.log('the promise fulfilled');
resolve('hello,world');
}, 1000);
});
setTimeout( () => {
promise.then( value => {
console.log(value);
});
}, 2000);

then 里不返回 Promise

[外链图片转存失败(img-pb1Hlk9O-1563275786820)(https://upload-images.jianshu.io/upload_images/11158618-a10353f9e0f93eb3.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

then 的嵌套

[外链图片转存失败(img-ea42h6rY-1563275786825)(https://upload-images.jianshu.io/upload_images/11158618-588081b6b6e3b971.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

.then的链式调用

[外链图片转存失败(img-VtGxiKXk-1563275786830)(https://upload-images.jianshu.io/upload_images/11158618-e92fb29df8b04954.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

console.log('start');
new Promise( resolve => {
console.log('Step 1');
setTimeout(() => {
resolve(100);
}, 1000);
})
.then( value => {
return new Promise(resolve => {
console.log('Step 1-1');
setTimeout(() => {
resolve(110);
},1000);
})
.then( value=> {
console.log('Step 1-2');
return value;
})
.then( value=> {
console.log('Step 1-3');
return value;
});
})
.then(value=> {
console.log(value);
console.log('Step 2');
});

Promise的四种情况:

doSomething()
.then(function(){
return doSomethingElse();
})
.then(finalHandler);

第一步执行,doSomething,第二步执行,doSomethingElse(undefined),第三步执行,finalHander(resultOfDoSomethingElse)

doSomething()
.then(function () {
doSomethingElse();
})
.then(finalHander);

第一步执行doSomething,第二步执行doSomethingElse(undefined),findHandler(undefined)

doSomething()
.then(doSomethingElse())
.then(finalHandler);

第一步,doSomething,doSomethingElse(undefined),第二步,finalHandler(resultOfDoSomething)

doSomething()
.then(doSomethingElse)
.then(finalHandler);

第一步doSomething,第二步doSomethingElse(resultOfDoSomething),第三步,finalHandler(resultOfDoSomethingElse)

这四项承诺有什么区别?

doSomething().then(function () {
return doSomethingElse();
}); doSomething().then(function () {
doSomethingElse();
}); doSomething().then(doSomethingElse()); doSomething().then(doSomethingElse);

错误处理

Promise会自动捕获内部异常,并交给rejected响应函数处理。

[外链图片转存失败(img-2Le2Nzt1-1563275786832)(https://upload-images.jianshu.io/upload_images/11158618-bd6dff5eebfe6a77.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

[外链图片转存失败(img-pangcVZg-1563275786833)(https://upload-images.jianshu.io/upload_images/11158618-0021384fa4d70345.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

错误和then连用

.catch + .then()

[外链图片转存失败(img-rvSdiq7W-1563275786838)(https://upload-images.jianshu.io/upload_images/11158618-1edf0bfcd0107e78.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

[外链图片转存失败(img-MpdUSfFV-1563275786840)(https://upload-images.jianshu.io/upload_images/11158618-fa8d43f841c51a52.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

[外链图片转存失败(img-L54XZ3uj-1563275786841)(https://upload-images.jianshu.io/upload_images/11158618-2e2a6b113517180d.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

Promise.all

[外链图片转存失败(img-jx0vSCMh-1563275786844)(https://upload-images.jianshu.io/upload_images/11158618-0114d601fb831a9a.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

[外链图片转存失败(img-n7lgskt8-1563275786847)(https://upload-images.jianshu.io/upload_images/11158618-08e50150a2c6e4b0.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

[外链图片转存失败(img-ttBgxamO-1563275786849)(https://upload-images.jianshu.io/upload_images/11158618-c9f412f63d3d4713.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

[外链图片转存失败(img-WKcZVtZU-1563275786850)(https://upload-images.jianshu.io/upload_images/11158618-16ccd20121a0d98a.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

与 .map 连用

[外链图片转存失败(img-wrW94rpj-1563275786851)(https://upload-images.jianshu.io/upload_images/11158618-d519d4839f785ac4.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

实现队列

[外链图片转存失败(img-L3iLa9zV-1563275786851)(https://upload-images.jianshu.io/upload_images/11158618-506f93918620bbfd.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

[外链图片转存失败(img-PB1b4bEI-1563275786854)(https://upload-images.jianshu.io/upload_images/11158618-371080deebd867fb.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

[外链图片转存失败(img-N2aSBf78-1563275786855)(https://upload-images.jianshu.io/upload_images/11158618-e655fb40dbc0d9ae.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

[外链图片转存失败(img-9ETjmwV6-1563275786856)(https://upload-images.jianshu.io/upload_images/11158618-1acd9aa01d2f44a6.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

[外链图片转存失败(img-cNWApSMG-1563275786858)(https://upload-images.jianshu.io/upload_images/11158618-5dbd4a81a3cc37d7.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

[外链图片转存失败(img-ORm5ywmt-1563275786859)(https://upload-images.jianshu.io/upload_images/11158618-b50863e2d2f4c084.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

实现爬虫

[外链图片转存失败(img-G88je6rV-1563275786860)(https://upload-images.jianshu.io/upload_images/11158618-b25e8fd0117747a7.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

Promise.resolve

Promise.reject

Promise.race

class Confirm {
constructor() {
this.promise = new Promise( (resolve, reject) => {
this.confirmButton.onClick = resolve;
this.cancelButton.onClick = reject;
});
}
}

异步函数

async/await

[外链图片转存失败(img-uPT4NB5I-1563275786863)(https://upload-images.jianshu.io/upload_images/11158618-04ff4db56e06cf7b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]


请点赞!因为你的鼓励是我写作的最大动力!

[外链图片转存失败(img-v0kSdgvF-1563275786868)(//upload-images.jianshu.io/upload_images/11158618-f0c11041a76563e7?imageMogr2/auto-orient/strip|imageView2/2/w/1240 “喜欢我就关注我”)]

吹逼交流群:711613774

[外链图片转存失败(img-GBd05T10-1563275786870)(//upload-images.jianshu.io/upload_images/11158618-d9d64fa290371ea5.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]

【一起来烧脑】读懂Promise知识体系的更多相关文章

  1. 【一起来烧脑】读懂HTTP知识体系

    背景 读懂HTTP很重要,参加过面试的小伙伴都很清楚,无论是技术面试面试题出得怎样,都有机会让你讲解一下HTTP,大部分都会问一下. 面试官:考考你网络协议的知识,TCP协议和UDP协议的区别,HTT ...

  2. 【一起来烧脑】读懂WebApp知识体系

    背景 很多小白知道什么是app,但是却不知道什么是webapp呢,webapp是指用HTML5编写的移动web应用 一个webapp可以在pc端,Android端,ios端进行运行 webapp开发的 ...

  3. 【一起来烧脑】读懂JQuery知识体系

    背景 在现在就业的过程中,会运用JQuery是你的加分项,那么什么是JQuery,嗯,jquery是JavaScript的函数库,是一种轻量级的JavaScript库,写得少,做的多,导致jQuery ...

  4. 【转】一篇文章读懂人力资源三支柱体系(COE・BP・SSC)

    通过人力资源转型,提升效率和效能   作者:Sharon Li,翰威特大中华区咨询总监. 杰克韦尔奇曾说过“人力资源负责人在任何企业中都应该是第二号人物”,但在中国,99%的企业都做不到.原因很简单, ...

  5. 一文读懂 Java 异常体系

    写程序的时候,编辑器会提示错误,关键字拼错了,语法不符合规则,不符合泛型:程序编译的时候,编译器会提示错误,检查是否符合 Java 的语法规范,没有通过编译器检查的程序就无法编译,也就无法运行.这些都 ...

  6. 一篇文章,读懂Netty的高性能架构之道

    一篇文章,读懂Netty的高性能架构之道 Netty是由JBOSS提供的一个java开源框架,是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架, ...

  7. web前端知识体系总结

    1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在一个视图中,形成一个完整的web前端知识体系,目的 ...

  8. 一文读懂UGC:互联网上的生态秘密

    转载自近乎: UGC(User- Generated Content)用户原创生产内容,它是相对于PGC(Professionally-produced Content)专业生产内容的一种内容来源,简 ...

  9. 自己总结的web前端知识体系大全【欢迎补充】

    1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在一个视图中,形成一个完整的web前端知识体系,目的 ...

随机推荐

  1. Java调用WebService方法总结(2)--JAX-WS调用WebService

    用JAX-WS(Java API for XML Web Services)调用WebService不需要引入其他框架,都是JDK自带的:文中所使用到的软件版本:Java 1.8.0_191.Dom4 ...

  2. 四 python中关于OOP的常用术语

    抽象/实现 抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于 绘程序结构,从而实现这种模型.抽象不仅包括这种模型的数据属性,还定义了这些数据的接口. 对某种抽象的实现 ...

  3. idea全局护眼色绿豆沙

    1.settings->plugins->BackgroundImage 2.在导航栏选择Help->FindAction 3.set background image 4.选择图片 ...

  4. MySQL比较时间(datetime)大小

    获取时间返回的秒数:strtotime('2019-05-10 00:00:00') 遇到一个业务功能需要将当前时间与数据库中的会议开始.结束时间进行比较,记录一下,方便下次用. 用unix_time ...

  5. tp5隐藏入口文件(基于nginx)

    location / {             try_files $uri $uri/ /index.php?$query_string; #这项配置解决访问根目录以外路径报404的错误      ...

  6. Python学习日记(五) 编码基础

    初始编码 ASCII最开始为7位,一共128字符.最后确定8位,一共256个字符,最左边的为拓展位,为以后的开发做准备. ASCII码的最左边的一位为0. 基本换算:8位(bit) = 1字节(byt ...

  7. 阿里云ACA—— I

    ACA 阿里云大数据助理工程师 阿里云大学 大数据助理工程师课程笔记分享, 本资料仅供个人学习,不允许用作商业用途,侵权必删 == Alibaba Cloud Certification Associ ...

  8. KVM虚拟化之嵌套虚拟化nested

    本文测试物理机为centos6.5 物理机使用Intel-V虚拟化架构,安装qemu-kvm版本0.12 我们知道,在Intel处理器上,KVM使用Intel的vmx(virtul machine e ...

  9. vi / vim 字符替换详解

    :s/idoxu/isTester.com/g 替换当前行所有 idoxu 为 isTester.com :n,$s/idoxu/isTester.com/ #替换第 n 行开始到最后一行中每一行的第 ...

  10. 用js刷剑指offer(从1到n整数中1出现的次数)

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...