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

这篇具有很好参考价值的文章主要介绍了前端多线程处理 —— Promise对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

以发送网络请求为例,在以往的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");
});

 文章来源地址https://www.toymoban.com/news/detail-711109.html

到了这里,关于前端多线程处理 —— Promise对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端异步编程全套:xmlhttprequest > ajax > promise > async/await

    同步与异步区别 同步:按顺序,依次执行,向服务器发送请求--客户端做其他操作 异步:分别执行,向服务器发送请求==同时执行其他操作 原生xmlhttprequest 四步骤 创建ajax对象 设定数据的传输方式(get、post),打开连接open() 获得响应数据 属性 描述 onreadystatechange 当readysta

    2024年02月01日
    浏览(36)
  • 【前端异常】JavaScript错误处理:分析 Uncaught(in promise) error

    在开发过程中,JavaScript的错误处理是一个老生常谈的话题。当应用程序发生未捕获的异常时,Uncaught(in promise) error是其中最常见的错误类型。这篇文章将从多个方面详细阐述这种错误类型的原因与解决方案。 Promise是一种用于异步编程的原生JavaScript对象。它提供了一种处理异

    2024年02月05日
    浏览(41)
  • 【Js 前端面向对象编程具体该怎么做】

    在 JavaScript 中,面向对象编程可以通过以下方式实现: 使用构造函数创建对象:使用构造函数可以创建具有相同属性和方法的多个对象。 例子: 使用原型创建对象:使用原型可以在多个对象之间共享属性和方法,从而减少内存的占用。 例子: 继承:可使用原型继承创建一

    2024年02月16日
    浏览(32)
  • Android中的多线程编程与异步处理

    在移动应用开发中,用户体验是至关重要的。一个流畅、高效的应用能够吸引用户并提升用户满意度。然而,移动应用面临着处理复杂业务逻辑、响应用户输入、处理网络请求等多个任务的挑战。为了确保应用的性能和用户体验,多线程编程和异步处理成为了不可或缺的技术

    2024年02月11日
    浏览(39)
  • Java多线程编程中的异常处理策略

    第1章:引言 大家好,我是小黑,咱们今天聊聊异常处理。想必大家在写代码的时候都遇到过各种各样的异常吧?有时候,一个小小的异常如果处理不当,就可能导致整个程序崩溃。特别是在多线程环境下,异常处理就像是在拆雷,稍不留神,程序就可能“炸”了。 为啥多线

    2024年02月01日
    浏览(38)
  • Windows核心编程(第五版)_1_错误处理_字符处理_内核对象

    ʕ •ᴥ•ʔ ɔ: 调用Windows函数时,它会先验证我们传给它的参数,然后再开始执行任务。如果传入的参数无效,或者由于其他原因导致操作无法执行,则函数的返回值将指出函数因为某些原因失败了。表1-1展示了大多数Windows函数使用的返回值的数据类型。 1.1 函数的错误码 通

    2024年02月08日
    浏览(30)
  • Vue前端处理blob二进制对象图片的方法

    近期在做开发的时候遇到一个问题,前端传递一个参数,后端返回一张图片,前端再将该图片展示出来,由于是第一次处理二进制图片对象,特此记录一下。 首先,已知后端接口无误,传递参数可以正常返回图片    前端调用接口,打印并查看获取到的响应数据:     显然

    2024年02月16日
    浏览(32)
  • 前端常见需求整理 - 日期处理(包含moment、时间戳、日期对象)

    moment对象 使用 UI 框架的时间相关组件时(如 ant-design),默认的绑定值的格式往往为这种。 字符串 部分栗子 对应 YYYY-MM-DD HH:mm:ss 2022-04-12 20:30:00 YYYY/MM/DD HH:mm:ss 2022/04/12 20:30:00 YYYY/MM/DD hh:mm:ss 2022/04/12 08:30:00 YYYY/M/D HH:mm:ss 2022/4/12 20:30:00 YYYY/MM/DD HH:mm 2022/04/12 20:30 日期对象 通过

    2024年02月09日
    浏览(32)
  • 【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制

    这一篇文章分享本人学习win32绘图编程,其中包括GDI绘图对象,绘图基础,基本图形的绘制,画笔画刷的使用,文本绘制,以及文本字体的更改。 绘图设备DC(Device Context),有时也叫做绘图上下文/绘图描述表/显示设备上下文 HDC-DC句柄,表示绘图设备 GDI-Windows graphics device

    2024年02月07日
    浏览(30)
  • 【深入浅出C#】章节 9: C#高级主题:多线程编程和并发处理

    多线程编程和并发处理的重要性和背景 在计算机科学领域,多线程编程和并发处理是一种关键技术,旨在充分利用现代计算机系统中的多核处理器和多任务能力。随着计算机硬件的发展,单一的中央处理单元(CPU)已经不再是主流,取而代之的是多核处理器,这使得同时执行

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包