promise简书的一篇将promise的文章写的很详细
https://www.jianshu.com/p/1b63a13c2701
promise是一个对象,对象和函数的区别就是对象可以保存状态,函数不可以(闭包除外)
并未剥夺函数return的能力,因此无需层层传递callback,进行回调获取数据
代码风格,容易理解,便于维护
多个异步等待合并便于解决
作者:王云飞_小四_wyunfei
链接:https://www.jianshu.com/p/1b63a13c2701
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
基本语法
// 实例化 Promise 对象
const p = new Promise(function(resolve, reject) {
setTimeout(function() {
// let data = '数据'
// resolve(data);
let err = '数据读取失败';
reject(err);
}, 1000)
});
//调用 promise 对象 then 方法
p.then(function(value) {
console.log(value);
}, function(reason) {
console.error(reason);
})
promise 读取文件
// 引入 fs模块
const fs = require('fs');
// // 调用方法读取文件
// fs.readFile('./resources/为学.md', (err, data) => {
// if (err) throw err;
// console.log(data.toString());
// })
// 使用promise 封装
const p = new Promise(function(resolve, reject) {
fs.readFile('./resources/为学.md', (err, data) => {
//如果判断失败
if (err) reject(err);
//成功
resolve(data)
})
});
p.then(function(value) {
console.log(value.toString());
}, function(reason) {
console.log(reason);
})
封装ajax
// 引入 fs模块
const fs = require('fs');
// // 调用方法读取文件
// fs.readFile('./resources/为学.md', (err, data) => {
// if (err) throw err;
// console.log(data.toString());
// })
// 使用promise 封装
const p = new Promise(function(resolve, reject) {
fs.readFile('./resources/为学.md', (err, data) => {
//如果判断失败
if (err) reject(err);
//成功
resolve(data)
})
});
p.then(function(value) {
console.log(value.toString());
}, function(reason) {
console.log(reason);
})
then 方法
// 创建 promise 对象
const p = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('用户数据');
//reject(data)
}, 1000)
});
//调用 promise 对象 then 方法
// then 方法的返回结果是 promise对象 对象状态由回调函数的执行结果决定
// 如果回调函数中返回的结果是 非 promise 类型的属性 状态为成功 返回值为对象的成功的值
const result = p.then(value => {
console.log(value);
// 非 promise 类型
//return 123
// 是 promise 对象
// return new Promise((resolve, reject) => {
// //resolve('ok');
// reject('error')
// })
// 抛出错误
//throw new Error('error')
//throw '出错啦'
}, reason => {
console.warn(reason);
})
//console.log(result);
// 链式调用
p.then(value => {
}, reason => {
}).then(value => {
}, reason => {})
catch 方法
const p = new Promise((resolve, reject) => {
setTimeout(() => {
//设置 p 对象的状态为失败, 并设置失败的值
reject("出错啦!");
}, 1000)
});
p.then(function(value) {}, function(reason) {
console.error(reason);
});
p.catch(function(reason) {
console.warn(reason);
});
实例
// 引入 fs模块
const fs = require('fs');
fs.readFile('./resources/为学.md', (err, data1) => {
fs.readFile('./resources/插秧诗.md', (err, data2) => {
fs.readFile('./resources/观书有感.md', (err, data3) => {
let result = data1 + ` \n` + data2 + `\r\n` + data3;
//console.log(result);
});
});
});
// 使用 promise 实现
const p = new Promise((resolve, reject) => {
fs.readFile('./resources/为学.md', (err, data) => {
resolve(data);
});
});
p.then(value => {
return new Promise((resolve, reject) => {
fs.readFile('./resources/插秧诗.md', (err, data) => {
resolve([value, data]);
});
})
}).then(value => {
return new Promise((resolve, reject) => {
fs.readFile('./resources/观书有感.md', (err, data) => {
// 压入
value.push(data);
resolve(value);
});
})
}).then(value => {
console.log(value.join('\n'));
})