Promise 是什么有什么及优缺点
ECMAscript 6 原生提供了 Promise 。
Promise 是一个构造函数,自身函数上有些常用方法,原型上有then、catch 同样很眼熟的方法。
all: ƒ all()
allSettled: ƒ allSettled()
any: ƒ any()
length: 1
name: "Promise"
prototype: Promise
catch: ƒ catch()
constructor: ƒ Promise()
finally: ƒ finally()
then: ƒ then()
Symbol(Symbol.toStringTag): "Promise"
[[Prototype]]: Object
race: ƒ race()
reject: ƒ reject()
resolve: ƒ resolve()
Symbol(Symbol.species): ƒ Promise()
Symbol(Symbol.species): ƒ Promise()
arguments: (...)
caller: (...)
有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。
Promise 也有一些缺点。首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。
其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。
第三,当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
Promise 怎么用
封装一个 ajax 与 使用
const p = new Promise(function(resolve, reject) {
const xhr = new XMLHttpRequest();
xhr.open("GET","https://api.xxx.top/getJoke");
xhr.send();
xhr.onreadystatechange = function() {
if(xhr.readyState === 4) {
if(xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.response);
}else {
reject(xhr.status);
}
}
}
});
p.then(function(value){
console.log(value);
},function(reason) {
console.log(reason);
})
封装一个本地文件内容
const fs = require('fs');
const p = new Promise(function(resolve, reject) {
fs.readFile('./dmeo.md',(err,data) => {
if(err) reject(err);
resolve(data);
});
});
p.then(function(value) {
console.log('调用成功~');
console.log(value.toString());
},function(reason) {
console.log('文件读取失败~~');
})