欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ES6 -- Promise初探

程序员文章站 2022-06-13 15:52:29
...

Promise铺垫

异步编程:无论是在浏览器环境还是在node环境中,我们都会使用JavaScript完成各种异步操作,如浏览器环境中的定时器、事件、ajax等或是node环境中的文件读取、事件等。伴随着异步编程的就是回调机制,异步编程避免不了回调。
异步编程问题

  • 产生回调地狱,难于维护和扩展
  • try catch只能捕获同步代码中出现的异常
  • 同步并发的异步存在一定的问题
// 在node里面跑,回调地狱
let fs = require('fs');
fs.readFile('./xxx', 'utf-8', (err, data) => {
	data && fs.readFile('./xxx', 'utf-8', (err, data) => {
		data && fs.readFile('./xxx', 'utf-8', (err, data) => {
			console.log(data);
		});
	});
});

// try catch
try {
	setTimeout(() => {
		console.log(a);    // 报错,try catch捕获不到
	});
} catch(e) {
	console.log(e);
}
setTimeout(() => {
	try {
		console.log(a);
	} catch (e) {
		console.log(e);   // 捕获到异常
	}
});

// 异常弥补
// 浏览器


// 同步并发
let oStudent = {

}
function show (data) {
    console.log(data);
}
var fs = require('fs');
// 三个文件全部读取完毕后调用show
fs.readFile('./data/name.txt', 'utf-8', (err, data) => {
    if(data) oStudent.name = data;
    Store.fire(oStudent);
});
fs.readFile('./data/number.txt', 'utf-8', (err, data) => {
    if(data) oStudent.number = data;
    Store.fire(oStudent);
});
fs.readFile('./data/score.txt', 'utf-8', (err, data) => {
    if(data) oStudent.score = data;
    Store.fire(oStudent);
});
// 订阅模式
let Store = {
    list: [],
    times: 3,
    subscribe (func) {
        this.list.push(func);
    },
    fire (...arg) {
        --this.times == 0 && this.list.forEach((ele) => {
            ele.apply(null, arg);
        });
    }
}
Store.subscribe(show);