Promise异步控制对象
使用Promise的原因(以读取文件为例)
-
首先👋创建一个文件夹,创建三个txt文件以及一个js文件(我以a.txt、b.txt、c.txt和rfs.js文件为例)
-
在a.txt、b.txt、c.txt分别写入文字(建议内容不要过多)
-
在rfs.js写入以下代码
var fs = require('fs'); //引入fs模块 fs.readFile('./a.txt','utf8',function(err,data1){ console.log(data1); }) //读取a.txt文件内容 fs.readFile('./b.txt','utf8',function(err,data2){ console.log(data2); }) //读取b.txt文件内容 fs.readFile('./c.txt','utf8',function(err,data3){ console.log(data3); }) //读取c.txt文件内容
-
打开终端运行js文件(❓思考)
-
我们运行之后得出的结果一定是按照a/b/c.txt文件内容顺序吗?(不一定)
-
如何解决该类现象呢?(回调函数)
var fs = require('fs'); //引入fs模块 fs.readFile('./a.txt','utf8',function(err,data1){ console.log(data1); fs.readFile('./b.txt','utf8',function(err,data2){ console.log(data2); fs.readFile('./c.txt','utf8',function(err,data3){ console.log(data3); }) }) }) //顺序读取a/b/c.txt文件
-
多层回调进入“回调地狱”如何解决?(Promise)
-
Promise的使用(EcmaScript 6 中新增的API)
-
先读一个文档
var fs = require('fs'); //引入fs模块 var p1 = new Promise(function(res,rej){ fs.readFile('./a.txt','utf8',function(err,data){ //读取a.txt文件 if(err){ rej(err); }else{ res(data) } }) }); p1.then(function(data){ //调用promise的then方法 console.log(data); },function(err){ console.log(err); })
-
尝试读取多个文件
var fs = require('fs') //引入fs模块 function fun(files){ //files:传入文件名 return new Promise(function(succ,err){ //返回对象 fs.readFile(files,'utf8',function(err,data){ succ(data) }) }) } //调用promise的then方法 fun('./a.txt').then(function(data){ console.log(data); return(fun('./b.txt')); }) .then(function(data){ console.log(data); return(fun('./c.txt')) }) .then(function(data){ console.log(data) })
Promise原理
promise类似于一个容器
,每一次的异步都要创建一个promise容器,每一个异步都要使用一个独立的promise容器进行管理,这一次的异步要么成功要么失败,状态不可逆
。