• 七天入门node.js(03)


    Peomise

    什么是promise

    简单回答: 一种异步的解决方案

    回顾一下什么是异步

    ​ 事件 / setTimeout

    异步执行的时机

    ​ 同步->异步微任务->GUI渲染->异步宏任务

    为什么会有Promise

    传统的异步解决方案: 回调

    ​ 回调: 顾名思义 回头调用

    1. function a (fn:函数){
    2. if(成功){
    3. fn()
    4. }
    5. }
    6. a(function(){})

    回调地狱

    智力小测验:

    1. //如何实现如下代码
    2. getRes(1)(2)(3)(4)//结果 1+2+3+4 = 10

    回调地狱

    1. doSomething(function (result) { //第一个函数function就是sucessCallback
    2. doSomethingElse(result, function (newResult) {
    3. doThirdThing(newResult, function (finalResult) {
    4. console.log('Got the final result' + finalResult)
    5. }, failureCallback)
    6. }, failureCallback)
    7. }, failureCallback)

    promise的写法

    1. //创造一个Promise实例
    2. const promise = new Promise(function(resolve, reject) {
    3. // ... some code
    4. if (/* 异步操作成功 */){
    5. resolve(value);
    6. } else {
    7. reject(error);
    8. }
    9. });
    10. //上述代码可改进为:
    11. doSomething().then(function(result) { //result是doSomething函数成功执行的返回值
    12. return doSomethingElse(result) //执行器函数,同步回调
    13. })
    14. .then(function(newResult){ //newResult是doSomethingElse成功执行的返回值
    15. return doThirdThing(newResult)
    16. })
    17. .then(function(finalResult){
    18. console.log('Got the final result' + finalResult)
    19. })
    20. .catch(failureCallback) //统一的错误处理

    完全解决回调问题

    根本上去掉回调 await一般结合promise使用

    1. async function request() {
    2. try{
    3. const result = await doSomething()
    4. const newResult = await doSomethingElse(result)
    5. const finalResult = await doThirdThing(newResult)
    6. console.log('Got the final result' + finalResult)
    7. } catch (error) {
    8. failureCallback(error)
    9. }
    10. }

    课堂练习

    1. //如何得到结果 打印--->随便什么数据1
    2. function runAsync1(){
    3. var p = new Promise(function(resolve, reject){
    4. //做一些异步操作
    5. setTimeout(function(){
    6. console.log('异步任务1执行完成');
    7. resolve('随便什么数据1');
    8. }, 1000);
    9. });
    10. return p;
    11. }

    Promise的应用场景

    • 结合ajax进行一步请求
    • 结合网页实现异步加载 比如js文件或者图片

    Promise应用示例

    1. function loadImageAsync(url) {
    2. return new Promise(function(resolve, reject) {
    3. const image = new Image();
    4. image.onload = function() {
    5. resolve(image);
    6. };
    7. image.onerror = function() {
    8. reject(new Error('Could not load image at ' + url));
    9. };
    10. image.src = url;
    11. });
    12. }
    13. //函数调用
    14. loadImageAsync('7.png').then((image)=>{
    15. console.log(image)
    16. },(e)=>{
    17. console.log(e)
    18. })

    扩展

    1. //all 全部执行 按顺序
    2. Promise
    3. .all([runAsync1(), runAsync2(), runAsync3()])
    4. .then(function(results){
    5. console.log(results);
    6. });
    7. //race 全部执行 谁快谁先
    8. Promise
    9. .race([runAsync1(), runAsync2(), runAsync3()])
    10. .then(function(results){
    11. console.log(results);
    12. });

    总结:

    ​ promise:

    1. 1. 解决了回调地狱问题 取而代之的是用链式调用 把执行和结果处理分2
    2. 2. 解决异步性能等待的性能问题
    3. 3. 易读性更高,代码更加优雅,风格更加风骚

     

  • 相关阅读:
    Java 开源开发平台 O2OA V7.2.0 发布,新增系统配置图形化模块和企业文件模块!
    蓝桥杯DP算法——区间DP(C++)
    BGR 顺序中的 OpenCV-color
    Spring-ApplicationContext refresh的流程
    学习ASP.NET Core Blazor编程系列九——服务器端校验
    vue3 provide inject
    288页18万字智能化校园总体设计 目录
    有线热电偶温度验证系统
    电脑可以模拟人脑吗
    java中springBoot+oss基础使用
  • 原文地址:https://blog.csdn.net/weixin_45311714/article/details/127649795