码迷,mamicode.com
首页 > 其他好文 > 详细

Promise 的应用

时间:2019-02-12 22:00:37      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:一个   turn   i++   col   两种   adf   reject   dirname   require   

Promise 有三种状态,进行中(pending),已成功(fulfilled),已失败(rejected);

一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。

所以可以先实例化一个Promise对象,然后在使用 then 方法为Promise对象添加成功或错误的回调函数,但一般只会添加成功的回调函数。然后用catch捕获错误执行错误的回调函数

 1 const fs = require("fs");
 2 const path = require("path");
 3 
 4 function readFile (url){
 5     return new Promise((resolv,reject) => {
 6         fs.readFile(path.join(__dirname,url),"utf8",(err,data) => {
 7             if(err) return reject(err);
 8             resolv(data);
 9         })
10     })
11 }
12 
13 readFile("1.txt").then((data) => {
14     console.log(data+"\n第1个文件");
15     return readFile("2.txt");
16 }).then((data) => {
17     console.log(data+"\n第2个文件");
18     return readFile("3.txt");
19 }).then( data => {
20     console.log(data+"\n第3个文件");
21 }).catch( err => {
22     console.log(err.message);
23 })

使用递归实现

 1 const fs = require("fs");
 2 const path = require("path");
 3 (function () {
 4     let that = null;
 5     function ReadFile(arr) {
 6         this.i = 0;
 7         this.len = arr.length;
 8         this.arr = arr;
 9         that = this;
10     }
11 
12     function readFileArrThen(data) {
13         console.log(`读取第${that.i}个文件:${data}`);
14         that.i++;
15         if (that.i < that.len) {
16             that.readStart();
17         }
18     }
19 
20     function readFileArrCath(err) {
21         console.log(err.message);
22         that.i++;
23         if (that.i < that.len) {
24            that.readStart();
25         }
26     }
27 
28     ReadFile.prototype.readFileArr = function() {
29         return new Promise((resolve, reject) => {
30             fs.readFile(path.join(__dirname, that.arr[that.i]), "utf8", (err, data) => {
31                 if (err) return reject(err);
32                 resolve(data);
33             })
34         })
35     }
36 
37     ReadFile.prototype.readStart = function () {
38         that.readFileArr().then(readFileArrThen).catch(readFileArrCath);
39     }
40     
41     module.exports.ReadFile = ReadFile;
42 })()

 

Promise 的应用

标签:一个   turn   i++   col   两种   adf   reject   dirname   require   

原文地址:https://www.cnblogs.com/csdcs/p/10367015.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!