Node.js 异步编程

Node.js 异步编程

一. 异步编程的好处
1.异步编程不像同步编程,它不需要等待上一步的代码执行完之后再执行,而是先把异步代码存储在一个异步存储区,等待同步代码完成之后,在来执行异步代码。
1.1异步编程有很多特有的代码设计模式,为了实现同样的功能,使用同步方式和异步方式编写代码会有很大差异,新手在刚接触是会很难理解
1.2函数返回值
使用一个函数的输出作为另一个函数的输入是常见的需求,在同步方式下一般以下述方式编写代码:
var p1=f1(f2('input'))
在异步方式下,由于函数执行结果不是通过返回值,而是通过回调函数传递,因此一般按以下方式编写代码:
fn2('input', function(demo1) { fn1(output2, function(demo2) { }); });
这种方式就是一个函数套一个函数,层级变多了,就很麻烦

2.异步编程的几种方式

回调函数
最原始的写法,会产生回调地狱,代码易读性差且混乱:

let fs = require('fs');

fs.readFile('./a.txt', (err, data) => {
    if(err){
        console.log('readFile.error:', err);
    }else{
        fs.readFile('./b.txt', (err1, data1) => {
            if(err1){
                console.log('readFile.error:', err1);
            }else{
                return data + data1;
            }
        })
    }
})
promise

我们可以es6 中的方法来解决回调函数的情况:

let readFile = path => {
    return new Promise(function(resolve, reject){
       fs.readFile(path, (err, data) => {
           if(err){
               reject(err);
           }else{
               resolve(data);
           }
       }) 
    });
}
//然后使用 readFile 函数实现如下:
readFile('./a.txt')
    .then(data => readFile('./b.txt').then(data1 => data + data1))
    .catch(err => console.log('readFile.error:', err));

这样就解决了回调地狱的问题,不过建议封装到函数里
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mingjie777/article/details/104805699