美文网首页
异步编程之Promise(三)

异步编程之Promise(三)

作者: AMONTOP | 来源:发表于2018-12-27 09:42 被阅读0次

promise可以解决回调函数带来的问题

1、解决回调地狱

案例场景:在文档a.txt中存放正文档b.txt的路径,在文档b.txt中存放正文档c.txt的路径, 我们要取出文档c.txt里面的内容。

回调函数实现:

/* a.txt -> b.txt -> c.txt -> 输出内容*/
let fs = require('fs');
let readFiles = ()=>{    
    // 回调1
    fs.readFile('./a.txt','utf8',
       (err,data)=>{
        if(err) 
        return console.log(err);        
        // 回调2
        fs.readFile(data,'utf8',
        (err,data)=>{
            if(err) 
            return console.log(err);
            // 回调3
            fs.readFile(data,'utf8',
            (err,data)=>{                
               if(err) 
               return console.log(err);                
               console.log(data); 
            })
        })
    })
};

/*
调用输出结果:
喜欢IT, 就上撩课(itlike.com) 
*/
readFiles();

通过promise解决回调地狱:

let fs = require('fs');

// 1. 初始化promise
let readFiles =(filePath)=>{    
    return new Promise(
    (resolve,reject)=>{
        fs.readFile(filePath,'utf8',
        (err,data)=>{
            if(err) return reject(err);
            resolve(data);
        })
    })
};
            
// 2. 类似于链式的调用方式
readFiles('./a.txt')
.then((data)=>{    
    return readFile(data);
}).then((data)=>{
    // 获取b.txt中内容     
    return readFile(data);
}).then((data)=>{ 
    // 输出c.txt中内容   
    console.log(data)  
}).catch((err)=>{
   console.log(err)
});

2、同一时刻同步所有异步产生的结果

该场景在实际开发中有很多应用场景,比如:我们要提交一个操作时,需要结合之前的两个异步请求的结果才能进行。
再比如:你要进行下一个运算时,需要前面两个异步运算的结果才能进行。我们还是通过读取文件的案例来进行举例。

常规方式实现:

let fs = require('fs');

// 1. 统一输出所有异步产生的结果
let allContent = {};
let logAllContent =
 (key,data)=>{
    allContent[key] = data;
    if(Object.keys(allContent).length
       === 2){
        console.log(allContent)
    }
};
        
// 2. 分别异步读取文件中的内容
fs.readFile('./a.txt', 'utf8',
(err, data) =>{
    if (err) return console.log(err);
    logAllContent(data);
});
    
fs.readFile('./b.txt', 'utf8',
(err, data) =>{
    if (err) return console.log(err);
    logAllContent(data);
});

这样的方式虽然解决了问题,但是你不知道最终结果是在哪个异步函数中输出,而且你需要在所有的异步函数中都去调用打印方法

promise方式大大简化:
借助promise.all()方法,不管哪个promise谁先完成,该方法会按照数组里面的顺序将结果返回。

let fs = require('fs');
let readFiles = (filePath)=>{
    return new Promise(
    (resolve,reject)=>{
        fs.readFile(filePath,'utf8',
        (err,data)=>{
            if(err) return reject(err);
            resolve(data);
        })
    })
};

Promise.all(
    [readFiles('./a.txt'), 
     readFiles('./b.txt')]
).then(([data])=>{ 
   console.log({data})
});

相关文章

  • 异步编程之Promise(三)

    promise可以解决回调函数带来的问题 1、解决回调地狱 案例场景:在文档a.txt中存放正文档b.txt的路径...

  • Promise

    Promise接口的基本思想是,异步任务返回一个Promise对象。 Promise对象只有三种状态。 异步操作“...

  • Javascript异步编程之Promise

    异步回调的问题 层次嵌套很深,难以维护 无法正常的使用return和throw 无法正常的检索堆栈信息 (每次回调...

  • 异步编程之Promise(一)

    1、Js中常见的异步编程方式? 1)回调函数实现2)发布订阅、通知3)事件监听4)Promise/A+ 和 生成器...

  • 异步编程之Promise(二)

    实例 我们再用promise实现发邮件加工资的案例: 情况一: 在一定时间后(假设5s后),老板回复了邮件,可以是...

  • 我来回答饿了么大前端的问题(2)

    事件/异步 Promise promise迷你书Promise对象的三个状态 has-resolution, ha...

  • Promise使用

    Promise含义 Promise是一种异步编程的解决方案,它可以获得异步操作的消息。promise有三种状态:p...

  • 手写promise

    1. promise核心 使用 promise加入异步逻辑 前面的promise没有加异步的情况。增加异步就是在t...

  • 异步编程之Future和Promise

    最近在拾遗JS基础,看到Promise,总觉得和Java中的Future有联系,放在一块对比总结一下,加深记忆。 ...

  • promise知识

    1、promise对象 Promise是一种异步编程的解决方案, promise有三个状态:pending[待定]...

网友评论

      本文标题:异步编程之Promise(三)

      本文链接:https://www.haomeiwen.com/subject/qynllqtx.html