node.js异步编程之Promise

Promise

Promise出现的目的是解决Node.js异步编程中回调地域的问题。
Promise本身并没有提供新的功能,它只是异步编程中语法的改进。可以让我们异步骤API的执行和结果的处理进行分离。

Promise本身是构造函数,如果使用Promise去解决回调地域的问题,需要通过new运算符号去创建promise构造函数的实例对象。

let promise = new Promise((resolve,reject) =>{});

在创建实例对象的过程当中,我们需要为构造函数去传递一个匿名函数,在匿名函数当中有两个参数,一个是resolve,一个是reject。
实际上promise是想让原本的异步API的代码放在匿名函数当中。


```html
let promise = new Promise((resolve,reject) =>{
    setTimeout(()=>{
        if (true){

        }else{

        }
    },2000);
})

上述代码中有两秒钟的定时器,在定时器执行完成之后,异步API会有结果出来,Promise它不想让内部再去处理这个结果,它希望你能把结果拿到外面去处理。这是就需要用到resolve参数。
resolve参数实际上是一个函数,当异步API有返回结果的时候,可以去调用resolve函数,并且把异步API的执行结果通过参数的形式给它传出去,这是resolve的用处,将异步API的执行结果传递出去。第二个参数reject本身也是一个函数,当异步API执行失败了我们就可以调用reject这个函数把失败的结果传递到promise外面去。比如reject一个失败了。

let promise = new Promise((resolve,reject) =>{
    setTimeout(()=>{
        if (true){
            resolve({name:'法外狂徒张三'})
        }else{
            reject('失败了')
        }
    },2000);
});

从上述代码中看出,Promise实际上就是在原本异步API的外面去包裹一层,然后等原本的异步API有结果的时候,它给我们提供了两个方法,成功就用resolve把结果传递到整体的外边去,如果失败就调用reject把失败的信息传递到promise整体的外边去。就是这样的语法改进。
在Promise的外面如何拿到异步API的执行结果呢?
在let promise = new Promise((resolve,reject) =>{});以后得到promise的实例对象,我们要拿到这个结果就通过promise这个对象来拿到。
在promise中有一个then方法

promise.then(result => console.log(result))//{name:'张三'}
       .catch(error => console.log(error))//失败了		
const fs = require('fs');
let promise = new Promise((resolve, reject) =>{
    fs.readFile('./1.txt','utf-8',(err,result) =>{
        if(err != null){
            reject(err);
        }else{
            resolve(result);
        }
    });
})

promise.then((result) => {
    console.log(result);
})

在这里插入图片描述

const fs = require('fs');
let promise = new Promise((resolve, reject) =>{
    fs.readFile('./100.txt','utf-8',(err,result) =>{
        if(err != null){
            reject(err);
        }else{
            resolve(result);
        }
    });
})
// 链式编程
promise.then((result) => {
    console.log(result);
})
.catch((err)=>{
    console.log(err);
})

在这里插入图片描述

const fs = require('fs');
// fs.readFile('./1.txt','utf8',(err,result1) =>{
//    console.log(result1);
//    fs.readFile('./2.txt','utf8',(err,result2) =>{
//        console.log(result2); 
//        fs.readFile('./3.txt','utf8', (err,result3) =>{
//            console.log(result3);
//        })
//    })
// });
function p1(){
    return new Promise ((resolve,reject) => {
        fs.readFile('./1.txt','utf8',(err,result) =>{
            resolve(result)
        })
    });
}
function p2(){
    return new Promise ((resolve,reject) =>{
        fs.readFile('./2.txt','utf8',(err,result) =>{
            resolve(result)
        })
    });
}
function p3(){
    return new Promise ((resolve,reject) =>{
        fs.readFile('./3.txt','utf8',(err,result) =>{
            resolve(result)
        })
    });
}
p1().then((r1) => {
    console.log(r1);
    return p2();
}).then((r2) => {
    console.log(r2);  
    return p3();
}).then((r3) => {
    console.log(r3);
    // return p3();
})

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值