首页 > 其他分享 >前端多线程处理 —— Promise对象

前端多线程处理 —— Promise对象

时间:2023-10-26 23:13:24浏览次数:34  
标签:function 请求 前端 req xhr Promise new 多线程

在前端编程中,处理一些简短、快速的操作,在主线程中就可以完成。

但是,在处理一些耗时比较长以至于比较明显的事情,比如读取一个大文件或者发出一个网络请求,就需要子线程来完成,以避免只用单线程时造成页面一时无法响应的事情。

以发送网络请求为例,在以往的JavaScript中,使用多个回调函数来处理请求返回的多个状态,如下面的代码:

var xhr = new XMLHttpRequest();
 
xhr.onload = function () {                                              // 请求成功时调用
    document.getElementById("box1").innerHTML=xhr.responseText;
}
 
xhr.onerror = function () {                                             // 请求失败时调用
    document.getElementById("box1").innerHTML="请求出错";
}
 
xhr.open("GET", "./book1/chapt1.php", true);
xhr.send();

 如果该请求因为网络延迟等原因没有回应,页面就会卡在该位置而不会执行下面的代码,造成页面展示不佳的问题。

而使用 Promise 对象就不会有这个问题。如下面的代码:

function ajax(URL) {
    return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest();

        req.onload = function () {
            if (req.status === 200) { 
                    resolve(req.responseText);
                } else {
                    reject(new Error(req.statusText));
                } 
            };
        req.onerror = function () {
            reject(new Error(req.statusText));
        };
        
        req.open('GET', URL, true);
        req.send(); 
    });
}

var URL = "./book1/chapt1.php"; 

<!--  
    ajax函数返回的Promise对象函数会在子程序中执行
    主程序可以执行接下去的代码
    Promise的then函数和catch函数会等待请求的返回结果
-->
ajax(URL).then((value) => {                                         
    document.getElementById("box1") = value;                       // 请求成功
}).catch((error) => {
    document.getElementById("box1") = error;                       // 请求失败
});

这样看,Promise虽然解决了问题,但看起来更加复杂了,代码也更多了,但是在接下来的例子中,你会看到Promise使代码更优雅的应用。

例如有这样一个“函数瀑布”实现的功能:

setTimeout(function () {
    console.log("First");
    setTimeout(function () {
        console.log("Second");
        setTimeout(function () {
            console.log("Third");
            setTimeout(function () {
                console.log("Fourth");
            }, 2000);
        }, 1000);
    }, 2000);
}, 1000);

 可以想象,在一个复杂的程序中,这样的函数无论是维护还是异常处理都是一件特别繁琐的事情,而且会让缩进格式变得非常冗赘。

 

现在使用Promise来实现就有条理和优雅的多:

function print(delay, message) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            console.log(message);
            resolve();
        }, delay);
    });
}

print(1000, "First").then(function () {
    return print(2000, "Second");
}).then(function () {
    return print(1000, "Third");
}).then(function () {
    print(2000, "fourd");
});

 

标签:function,请求,前端,req,xhr,Promise,new,多线程
From: https://www.cnblogs.com/wuxxblog/p/17790732.html

相关文章

  • Java基础 多线程
    进程:进程是程序的基本执行实体(简单理解就是,一个软件运行之后,它就是一个进程)线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。简单说,线程就是应用软件中互相独立的、又可以同时运行的功能。如果这样的功能比较多,就形成了多线程 ......
  • 记录--记录用前端代替后端生成zip的过程,速度快了 57 倍!!!
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助业务场景:产品有个功能是设置主题。类似手机自动切换壁纸,以及其他功能颜色,icon,字体等。管理员需要在后端管理系统多次下载不同主题,(至于要干啥就不说了...),主题中可能有30~100个高清壁纸,icon等。现在每次下......
  • Python threading实现多线程 提高篇 线程同步,以及各种锁
    本文主要讲多线程的线程之间的资源共享怎么保持同步。多线程基础篇见,Pythonthreading实现多线程基础篇Python的多线程,只有用于I/O密集型程序时效率才会有明显的提高,如文件/输入输出/socket网络通信/http通讯等待。对于计算密集型程序一般采用多进程,这里不多讲。一、多线程的......
  • Python threading实现多线程 基础篇
    讲多线程前,先要了解什么是进程,什么是线程,已经知道的请略过。一、进程与线程:进程是资源分配的最小单位,一个程序至少有一个进程。线程是程序执行的最小单位,一个进程至少有一个线程。进程都有自己独立的地址空间,内存,数据栈等,所以进程占用资源多。由于进程的资源独立,所以通讯不方......
  • 前后端系统部署——前端篇
     在华为云耀云服务器L实例上部署前端需要经过以下几个步骤:首先登录华为云耀云界面:https://www.huaweicloud.com/product/hecs-light.html 创建华为云耀云服务器L实例账号,购买服务器并登录控制台。 创建华为云耀云服务器L实例。在控制台界面上,选择ECS(云服务器)服务,然后......
  • [Compose] Async generator, Promise + generator
    functiongetData(d){setTimeout(()=>{if(typeofd==="number"){run.next(d/2)}else{run.next(d)}},500)}function*gen(){varx=1+(yieldgetData(10))//x=1+5......
  • python 多线程的使用,爬取新发地菜价
    今天使用多线程来获取200页数据公众号回复 菜价 获取源码目标网站:#新发地菜价http://www.xinfadi.com.cn/priceDetail.html打开网站,发现是异步加载,然后点击xhr可以看到,数据就在这里然后我们点击负载,观察发现20代表每页展示多少条数据,不用管current则是代表页数点击标头,可以看......
  • 开发实例:后端Java和前端vue实现文件上传和下载功能
    首先,在Java的后端代码中,我们可以使用Spring框架来实现文件上传和下载功能。以下是一个简单的示例:文件上传首先,我们需要在html页面上创建一个表单,其中包含一个file类型的输入字段:<formaction="/upload"method="POST"enctype="multipart/form-data"><inputtype=......
  • 前端模块化
    1.为什么要有模块化在网页开发的早期,js制作作为一种脚本语言,做一些简单的表单验证或动画实现等,那时候的代码还是很少的。随着ajax异步请求的出现,慢慢的形成了前后端分离客户端需要完成的事情越来越多,代码量也与日俱增为了应对代码量的剧增,我们通常会将代码组织在多个js文件中,......
  • 027前端CMS ghost安装
    一、安装命令如下sudoadduserghostsudousermod-aGsudoghostsu-ghostcd/data/fe-doc-centercurl-o-https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh|bashnvminstallv18.17.1npmconfigsetregistryhttps://registry.npm.taobao.orgn......