随笔 - 750  文章 - 1  评论 - 107  阅读 - 34万

Vue - Promise (回调地狱)

Promise 是 ES6 中的构造函数,可以 new Promise()

new 出来的 Promise 实例对象,代表一个异步操作

 

在 Promise.prototype 上包含一个 .then() 方法,每一次 new Promise() 构造函数得到的实例对象,都可以 通过原型链的方式访问到 .then() 方法,例如 p.then()

 在 Chrome 浏览器的命令模式下,可以输入 

console.dir(Promise)

 

 

.then() 方法用来预先指定成功和失败的回调函数

p.then(成功的回调函数,失败的回调函数)

p.then(result =>{ }, error => { })

 

调用 .then() 方法时,成功的回调函数是必选的,失败的回调函数是可选的。

复制代码
/*
 *  基于 Promise 的方式读取文件
 */

import thenFs from "then-fs";

/*
thenFs.readFile('./files/1.txt','utf8').then(r1 => {console.log(r1)}, err1 =>{console.log(err1.message)})
thenFs.readFile('./files/2.txt','utf8').then(r2 => {console.log(r2)}, err2 =>{console.log(err2.message)})
thenFs.readFile('./files/3.txt','utf8').then(r3 => {console.log(r3)}, err3 =>{console.log(err3.message)})
*/

// 上述代码不能保证读取顺序,接下来加以改进

thenFs.readFile('./files/1.txt','utf8')
    .catch(err =>{
        console.log(err.message)        
    })
    .then((r1) => {
        console.log(r1)
        return thenFs.readFile('./files/21.txt','utf8')
    })
    .catch(err =>{
        console.log(err.message)        
    })
    .then((r2)=>{
        console.log(r2)
        return thenFs.readFile('./files/3.txt','utf8')
    })
    .catch(err =>{
        console.log(err.message)        
    })
    .then((r3)=>{
        console.log(r3)
    })
    .catch(err =>{
        console.log(err.message)        
    })
复制代码

这个读文件的例子有待改进,我们接下来学习 Promise.all  等方法

 在下面这个代码里,顺序是固定的,三个函数都必须执行后,才会输出结果

复制代码
const promiseArr = [
    thenFs.readFile('./files/1.txt','utf8'),
    thenFs.readFile('./files/2.txt','utf8'),
    thenFs.readFile('./files/3.txt','utf8')
]

Promise.all(promiseArr)
    .then(([r1,r2,r3]) =>{
        console.log(r1,r2,r3)
    })
    .catch(err=>{
        console.log(err.message)
    })
复制代码
Promise.race(promiseArr)
    .then((result) =>{
        console.log(result)
    })
    .catch(err=>{
        console.log(err.message)
    })

而使用 race 时,只要其中一个函数执行完成,就开始 then 操作,也就只有一个结果输出

可以对读文件的操作进行封装,如下所示:

复制代码
function getFile(fpath){
    return new Promise(function(resole,reject){
        fs.readFile(fpath,'utf8',(err,dataStr)=>{
                if(err)
                    return reject(err);
                return resole(dataStr);
        })
    })
}

getFile('./files/21.txt').then(
    (r1) => {console.log(r1)},
    (err) => {console.log(err.message)} // 这个可以省略,靠 catch 来捕获异常也可以
).catch(err=>{console.log(err)});
复制代码

 

posted on   z5337  阅读(326)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2021-07-16 [VS2019]常用命令
2017-07-16 [Android] 开发第六天
2017-07-16 [Android] 开发第五天
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示