前端异步编程 —— 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-711174.html

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

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

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

相关文章

  • 前端异步技术之Promise

    由于是参(抄)考(袭)前辈的polyfill,自己编码测试时出现了两处错误,ES6 Promise 规范的2.3.1和2.3.4 2.3.1 你们的支持是我最大的动力,熬夜码字不易,如果此文对你有帮助,请不吝star---https://github.com/chenchangyuan/promise 有兴趣加笔者好友的同学请扫描下方二维码(1.本人微信,

    2024年02月08日
    浏览(36)
  • promise及异步编程async await

    ECMAScript 6 新增了正式的 Promise(期约)引用类型,支持优雅地定义和组织异步逻辑。接下来几个版本增加了使用 async 和 await 定义异步函数的机制 JavaScript 是单线程事件循环模型。异步行为是为了优化因计算量大而时间长的操作,只要你不想为等待某个异步操作而阻塞

    2024年02月04日
    浏览(30)
  • JS中的异步编程与Promise

    在了解JavaScript的异步机制之前,我们首先需要理解JavaScript是一种单线程语言。单线程就意味着所有的任务需要按照顺序一次执行,如果前一个任务没有完成,后一个任务就无法开始。这个特性在执行大量或耗时任务时可能会导致阻塞或者界面卡死,这显然是不可取的。 为了

    2024年02月08日
    浏览(35)
  • [javascript核心-04]彻底弄懂Promise异步编程

    本文github地址:JavaScript_Interview_Everything 大前端知识体系与面试宝典,从前端到后端,全栈工程师,成为六边形战士 1.1. 快速上手 01快手上手.js 02.若传入的是另一个promise对象,则状态由传入的promise对象决定 03.若传入了一个实现了 then 方法的对象,则执行该then方法且由此方法

    2024年02月08日
    浏览(29)
  • ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代

    // kerwin {age:100,location: ‘dalian’} 其中…other 可以拿到对象的剩余参数 // {name: ‘xiaoming’,location: ‘dalian’,age: 18] 在实际开发中,我们会使用ajax() 封装一些默认的属性和属性值,以备用户忘记或未传入某些参数。 // { methods: “get”, async: true, url: “/api”} 正则表达式命名捕获

    2024年04月09日
    浏览(29)
  • 前端常见面试题之异步(event loop, promise, async/await, 宏任务/微任务)

    从前到后,一行一行执行 如果某一行执行报错,则停止下面代码执行 先把同步代码执行完,再执行异步 示例: 输出结果为: 可以看到,在执行异步操作的过程中,主线程不会等待异步操作结束,而是继续往下执行后续的代码,当满足条件时触发异步操作的回调函数。 异步

    2024年02月01日
    浏览(42)
  • 【angular教程240111】08异步数据流编程与angular :promise,Rxjs6.x

    【angular教程240111】08异步数据流编程与angular :promise,Rxjs6.x 三级目录 异步与 Rxjs6.x异步数据流编程-Angular Rxjs快速入门 一、 Rxjs介绍 二、 Promise和RxJS 处理异步对比 三、 Rxjs unsubscribe取消订阅 四、 Rxjs 订阅后多次执行 五、 Angualr6.x之前使用Rxjs的工具函数map filter 六、 Angualr6

    2024年02月02日
    浏览(31)
  • 前端技术栈 - ES6 - Promise -模块化编程

    ECMAScript 6.0(简称ES6)是JavaScript语言的下一代标准, 2015年6月发布. ES6设计目标: 达到JavaScript语言可以用来编写复杂的大型程序, 成为企业级开发语言. ECMAScript和JavaScript的关系就: ECMAScript是JavaScript的规范/规则, JavaScript是ECMAScript的一种实现. let.html +与,的区别 let_detail.html 细节1. l

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

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

    2024年02月05日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包