谈谈JS异步处理

118 阅读2分钟

大家都知道nodejs很快,为什么会这么快呢,原因就是node采用异步回调的方式来处理需要等待的事件,使得代码会继续往下执行不用在某个地方等待着。但是也有一个不好的地方,当我们有很多回调的时候,比如这个回调执行完需要去执行下个回调,然后接着再执行下个回调,这样就会造成层层嵌套,代码不清晰,很容易进入“回调监狱”,就容易造成下边的例子:

async(1, function(value){
 async(value, function(value){
 async(value, function(value){
  async(value, function(value){
  async(value, function(value){
   async(value, final);
  });
  });
 });
 });
});

这样的写法会让人崩溃,那么有什么办法可以解决这个问题呢,或者有其他别的写法吗?答案是有的,es6新出的promise对象已经es7的async await都可以解决这个问题。 (1)我们接下来首先谈一谈promise,下面是定义一个promise对象

let a = 1;
let promise = new Promise(function(resolve, reject){
       if(a==10){
           resolve('成功了');
       }else{
           reject('失败了');
       }
});

定义的promise对象接受成功和失败回调可以这样接收

promise.then(res=>{
      console.log(res); //成功回调
},err=>{
      console.log(err); //失败回调
})

也可以使用catch接收失败回调

promise.then(res=>{
      console.log(res); //成功回调
}).catch(err=>{ 
      console.log(err); //失败回调
})

下面是promise的一些api 1、Promise.resolve() 使用方法

let p1 = Promise.resolve('aaa');

p1.then(res=>{
      console.log(res);
})

等同于

let p1 = new Promise(resolve =>{
      resolve('aaa')
});

p1.then(res=>{
     console.log(res);
})

2、Promise.reject() 3、Promise.all() // 所有的都有完成,相当于 且 4、Promise.race() // 完成一个即可,相当于 或

(2)接下来我们来看一个使用node来异步读取文件的实例来展示 1、使用promise来实现

const fs = require('fs');

//简单封装  fs封装成一个promise
const readFile = function (fileName){
    return new Promise((resolve, reject) =>{
        fs.readFile(fileName, (err, data) =>{
            if(err) reject(err);
            resolve(data);
        });
    });
}


//promise
readFile('data/a.txt').then(res=>{
    console.log(res.toString());
    return readFile('data/b.txt');
}).then(res=>{
    console.log(res.toString());
    return readFile('data/c.txt');
}).then(res=>{
    console.log(res.toString());
})

2、使用generator来实现

const fs = require('fs');

//简单封装  fs封装成一个promise
const readFile = function (fileName){
    return new Promise((resolve, reject) =>{
        fs.readFile(fileName, (err, data) =>{
            if(err) reject(err);
            resolve(data);
        });
    });
}


//generator
function * gen(){
    yield readFile('data/a.txt');
    yield readFile('data/b.txt');
    yield readFile('data/c.txt');
}
let g1 = gen();

g1.next().value.then(res=>{
    console.log(res.toString());
    return g1.next().value;
}).then(res=>{
    console.log(res.toString());
    return g1.next().value;
}).then(res=>{
    console.log(res.toString());
})

看起来优雅了不少 3、使用async来实现

const fs = require('fs');

//简单封装  fs封装成一个promise
const readFile = function (fileName){
    return new Promise((resolve, reject) =>{
        fs.readFile(fileName, (err, data) =>{
            if(err) reject(err);
            resolve(data);
        });
    });
}


//async
async function fn(){
    let f1 = await readFile('data/a.txt');
    console.log(f1.toString());
    let f2 = await readFile('data/b.txt');
    console.log(f2.toString());
    let f3 = await readFile('data/c.txt');
    console.log(f3.toString());
    
}
fn();

以上就是一些简单的理解和学习记录。