Promise

回调函数的使用

对于异步操作的结果,我们无法获取到,通常使用回调函数来处理

Prosmise的本质

在异步操作中,经常要用到回调函数,因为异步操作使用return并不能及时返回我们想要的结果,但是大量使用回调函数会引起回调地狱问题,是的代码能以维护和理解

```
    const path = require('path')
    const fs = require('fs')

    function getFileByPath(fpath,callback) {
        fs.readFile(fpath,'utf-8',(err,dataStr)=>{
	        if (err) throw err;
	        callback(dataStr)
        })
    }

    getFileByPath(path.join(__dirname,'./file/1.txt'),(data)=>{
        console.log(data);

        getFileByPath(path.join(__dirname,'./file/2.txt'),(data)=>{
	        console.log(data);

	        getFileByPath(path.join(__dirname,'./file/3.txt'),(data)=>{
		        console.log(data);
	        })
        })


    })
```
Promise是单纯的为了解决回调地狱问题,并不能帮我们减少代码量

Promise的概念介绍

  • 1.Promise是一个构造函数,可以通过new Promise()得到一个promise实例
  • 2.promise有两个方法,分别是resolve(成功后的回调函数)和reject(失败之后的回调函数)
  • 3.promise的prototype属性上,有一个.then()方法,promise实例都可以访问.then()方法
  • 4.Promise表示一个异步操作,一个promise实例就表示一个具体的异步操作
  • 5.因为promis是一个异步操作,所以内部拿到操作结果后,无法使用return把操作的结构返回给调用者,只能通过回调函数把结果返回给调用者,异步操作的结果只有两种状态,成功或者失败,成功用resolve回调函数,失败用reject回调函数
  • 6.我们在promise实例上,调用.then()方法,预先为promise异步操作,指定成功或失败的回调函数

形式上的和具体的Promise异步操作

  var promise = new Promise()   // 这个new出来的实例就是形式上的异步操作:我们只知道这是一个异步操作,但是做什么具体的异步事情,还不知道

  var promise = new Promise(function() {})  // 这个function内部写的就是具体的异步操作

promise实例创建就会执行

```
    //因为promise实例创建就会执行,所以我们通常将它包裹在一个函数中,通过具体需求调用函数来执行
    const path = require('path')
    const fs = require('fs')

    function getFilebyPath(fpath) {
        var promise = new Promise(function() {
        fs.readFile(fpath,'utf-8',(err,dataStr) => {
		if( err ) throw err;
		console.log(dataStr);
	});
    });
    }        

getFilebyPath('./file/1.txt');

```

promise的执行过程

- getFilebyPath函数调用
- 去到函数定义的内部,先创建promise实例
- 函数定义的内部返回promise对象实例
- getFilebyPath函数调用处使用.then()方法预先绑定resolve和reject方法
- readFile异步处理是调用resolve和reject方法

promise解决回调地狱问题

promise异常处理的两种情况

  • 前面的promise处理失败,但不影响后面的异常处理
  • 前面的promise处理失败,后续promise不必处理
posted @ 2020-02-21 14:57  zero博士  阅读(126)  评论(0)    收藏  举报