当前位置: 首页 > article >正文

【前端,TypeScript】TypeScript速成(八):Promise

Promise

前端编程是一个单线程的模型,但是其中包含许多异步的动作,异步的动作应该通过以下四步来完成:

  • 发起请求;
  • 事件处理函数结束;
  • 请求结束;
  • 进入回调函数;

上述的基于回调函数解决方案不够好,当事件请求过多时,可能会产生 Callback Hell 现象。使用 Promise 可以解决回调函数的问题。

Promise 的创建和使用

我们首先来看一个回调函数的例子,在这个例子中,我们在回调函数中进行简单的 number 加法:

function add(a: number, b: number, callback: (res: number) => void): void {
    setTimeout(() => {
        callback(a + b)
    }, 2000)
}

add(2, 3, res => {
    console.log('2 + 3', res)
    add(res, 4, res2 => {
        console.log('2 + 3 + 4', res2)
    })
})

程序将先后输出:

[LOG]: "2 + 3",  5 
[LOG]: "2 + 3 + 4",  9 

现在我们将回调函数改为 Promise:

function add(a: number, b: number): Promise<number> {
    return new Promise(
        (resolve, reject) => {
            setTimeout(() => {
                resolve(a + b)
            }, 2000)
        }
    )
}

add(2, 3).then(res => {
    console.log('2 + 3', res)
})

可以使用 then 方法来完成多个计算结果的顺序打印:

function add(a: number, b: number): Promise<number>{
    return new Promise(
        (resolve, reject) => {
            if(b % 17 == 0) {
                reject(`bad number ${b}`)
            }
            setTimeout(
                () => {
                    resolve(a + b)
                }, 2000
            )
        }
    )
}

function mul(a: number, b: number): Promise<number>{
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(a * b)
        }, 3000)
        // resolve(a * b)
    })
}

// (2 + 3) * 4 + 5
add(2, 3).then(res => {
    console.log("2 + 3", res)
    return mul(res, 5)
}).then(res => {
    console.log("(2 + 3) * 4", res)
    return add(res, 5)
}).then(res => {
    console.log("(2 + 3) * 4 + 5", res)
    return add(res, 17)
}).then(res => {
    console.log(res)
}).catch(err => {
    console.log(err)
})

输出的结果是:

[LOG]: "2 + 3",  5 
[LOG]: "(2 + 3) * 4",  25 
[LOG]: "(2 + 3) * 4 + 5",  30 
[LOG]: "bad number 17" 

需要注意的是,在使用 then 方法时,一定要在 then 作为参数的箭头函数当中将下一步要做的行为返回出去,这样才能创建多个 Promise。

同时等待多个 Promise

现在我们希望通过 Promise 来计算(2 + 3) * (4 + 5)的结果,使用 Promise.all 方法来完成:

// (2+3)*(4+5)
Promise.all([add(2, 3), add(4, 5)]).then(res => {
    let [a, b] = res
    return mul(a, b)
}).then(res => {
    console.log("(2+3)*(4+5)", res)
})

可以使用 Promise.race 来看哪个 Promise 首先执行完毕:

Promise.race([add(2, 3), add(4, 5)]).then(res => {
    console.log(res)
})

Promise 最大的用处是将多种行为串联起来,可以解决 Callback Hell 的问题。


http://www.kler.cn/a/474213.html

相关文章:

  • git的rebase和merge的区别?
  • 江科大STM32入门——IIC通信笔记总结
  • 对快速由表及里说拜拜/如何正确运用由表及里
  • Django学习笔记之数据库(一)
  • 单片机实现模式转换
  • SSM-SpringMVC-请求响应、REST、JSON
  • 机器学习的组成
  • PDFMathTranslate: Star13.8k,一款基于AI的PDF文档全文双语翻译PDF文档全文双语翻译,保留格式神器,你应该需要它
  • R语言的语法
  • 《鸿蒙系统AI技术:筑牢复杂网络环境下的安全防线》
  • 模型评估指标总结(预测指标、分类指标、回归指标)
  • 【开源免费】基于Vue和SpringBoot的贸易行业crm系统(附论文)
  • TVbox 手机、智能电视节目一网打尽
  • HarmonyOS Next系列之华为账号一键登录功能实现(十四)
  • 【MySQL】九、表的内外连接
  • C# 实现 gRPC 进程间通讯:两台设备的数据交换之道
  • 前端笔记:获取leetcode题目
  • 【复杂网络演化博弈_01】理论部分+代码应用
  • [Unity]MacOS下开发Unity
  • TCP通信原理学习
  • sql 查询尾差(去尾0后小数点的位数)
  • maven如何从外部导包
  • liunx后台运行jar包
  • 2025 西电软工数据结构机考 Tip (By Felix)
  • npm run 运行项目报错:Cannot resolve the ‘pnmp‘ package manager
  • Centos7使用yum工具出现 Could not resolve host: mirrorlist.centos.org