JavaScript异步编程2——结合XMLHttpRequest使用Promise

简介: JavaScript异步编程2——结合XMLHttpRequest使用Promise

JavaScript异步编程2——结合XMLHttpRequest使用Promise

目录

1. 概述

在上一篇文章《JavaScript异步编程1——Promise的初步使用》,简单介绍了一下Promise的初步使用。复习一下,Promise异步编程可以用如下的范式来编写:

  1. 定义一个函数(function A),这个函数返回一个Promise对象。
  2. Promise对象的参数也是一个function B,内部进行了一个异步操作(通常是JavaScript提供的API)。
  3. function B对象的参数是两个回调函数resolve和reject。如果函数内部进行的异步操作成功,回调resolve;否则回调reject。
  4. 调用function A,返回一个Promise对象,这样异步操作就启动了。
  5. 调用Promise对象的then方法,参数是resolve和reject的真正响应函数。当异步操作完成了,就会执行相应分支的响应函数。

采用以上范式,可以通过Promise来进行Ajax操作,也就是XMLHttpRequest,毕竟这个操作在Web应用中实在太常见了。

2. 详论

首先仍然是准备一个HTML页面:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="./3rdParty/jquery-3.5.1.js"></script>
    <title>样例</title>
</head>
<body>
    <div id = "container"> </div>
    <script src="./PromiseTest.js"></script>
</body>
</html>

如果不使用Promise,那么相应的JavaScript代码为:

$(function () {
    var url = "./1.json";
    var req = new XMLHttpRequest();
    req.open('GET', url);
    req.onload = function () {        
        if (req.status == 200) {
            console.log(req.response);
        } else {           
            throw new Error(req.statusText);
        }
    };
    req.onerror = function () {
        throw new Error("Network Error");
    };
    req.send();
});

可以看到这里仍然是通过事件机制来实现异步行为。接下来采用前面提到的编程范式将其改造成Promise机制:

function get(url) {       
    return new Promise(function (resolve, reject) {      
        var req = new XMLHttpRequest();
        req.open('GET', url);
        req.onload = function () {
            //即使是404也会进入这个相应函数,所以需要检测状态
            if (req.status == 200) {
                //完成许诺,返回响应文本
                resolve(req.response);
            } else {
                //完成未完成,返回错误
                reject(Error(req.statusText));
            }
        };
        // 发生错误时的相应函数
        req.onerror = function () {
            reject(Error("Network Error"));
        };
        // 发送请求
        req.send();
    });
}
var addressUri = "./1.json";
get(addressUri).then(function (response) {
    console.log("Success!", response);      
}, function (error) {
    console.error("Failed!", error);
});

改造成Promise的过程与上一章并没有什么不同,只不过函数内部调用XMLHttpRequest的流程更加复杂些。这两个例子都是将事件改造成Promise,那不是意味着对于异步编程而言,Promise要优于事件呢?

不能完全这么肯定,但是可以确定的是事件并不总是异步编程的最优实践。一个很显然的问题就是:事件很适合处理在同一对象上多次发生的事情,但是事件侦听器的响应函数可能并不是我们想要的——更多情况下,我们只想要直到两个状态,当异步操作完成的时候该做什么,当异步操作失败的时候又该做什么,而这正是Promise擅长处理的。

例如这里的XMLHttpRequest操作,事件响应函数onload中的所有行为,并不都是异步请求成功时需要完成的,只有检测访问请求状态为200时候,才需要进行请求成功时的回调函数。使用Promise,可以更准确的进行异步行为。

3. 参考

  1. Ajax原理-原生js的XMLHttpRequest对象意义
  2. Javascript异步编程的4种方法

分类: JavaScript

标签: XMLHttpRequest , Ajax , Promise , Javascript


相关文章
|
1月前
|
前端开发 JavaScript
用JavaScript 实现一个简单的 Promise 并打印结果
用 JavaScript 实现一个简单的 Promise 并打印结果
|
1月前
|
JSON 前端开发 JavaScript
在 JavaScript 中,如何使用 Promise 处理异步操作?
通过以上方式,可以使用Promise来有效地处理各种异步操作,使异步代码更加清晰、易读和易于维护,避免了回调地狱的问题,提高了代码的质量和可维护性。
|
1月前
|
缓存 JavaScript 前端开发
掌握现代JavaScript异步编程:Promises、Async/Await与性能优化
本文深入探讨了现代JavaScript异步编程的核心概念,包括Promises和Async/Await的使用方法、最佳实践及其在性能优化中的应用,通过实例讲解了如何高效地进行异步操作,提高代码质量和应用性能。
|
26天前
|
JavaScript 前端开发 开发者
探索Node.js中的异步编程之美
在数字世界的海洋中,Node.js如同一艘灵活的帆船,以其独特的异步编程模式引领着后端开发的方向。本文将带你领略异步编程的魅力,通过深入浅出的讲解和生动的代码示例,让你轻松驾驭Node.js的异步世界。
|
1月前
|
前端开发 JavaScript Java
一文带你了解和使用js中的Promise
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,正向全栈进发。如果我的文章对你有帮助,请关注我,将持续更新更多优质内容!🎉🎉🎉
22 0
一文带你了解和使用js中的Promise
|
1月前
|
JavaScript API 开发者
深入理解Node.js中的事件循环和异步编程
【10月更文挑战第41天】本文将通过浅显易懂的语言,带领读者探索Node.js背后的核心机制之一——事件循环。我们将从一个简单的故事开始,逐步揭示事件循环的奥秘,并通过实际代码示例展示如何在Node.js中利用这一特性进行高效的异步编程。无论你是初学者还是有经验的开发者,这篇文章都能让你对Node.js有更深刻的认识。
|
1月前
|
前端开发 JavaScript UED
探索JavaScript的异步编程模式
【10月更文挑战第40天】在JavaScript的世界里,异步编程是一道不可或缺的风景线。它允许我们在等待慢速操作(如网络请求)完成时继续执行其他任务,极大地提高了程序的性能和用户体验。本文将深入浅出地探讨Promise、async/await等异步编程技术,通过生动的比喻和实际代码示例,带你领略JavaScript异步编程的魅力所在。
30 1
|
1月前
|
前端开发 JavaScript 开发者
除了 async/await 关键字,还有哪些方式可以在 JavaScript 中实现异步编程?
【10月更文挑战第30天】这些异步编程方式在不同的场景和需求下各有优劣,开发者可以根据具体的项目情况选择合适的方式来实现异步编程,以达到高效、可读和易于维护的代码效果。
|
1月前
|
前端开发 JavaScript 开发者
深入理解JavaScript异步编程
【10月更文挑战第29天】 本文将探讨JavaScript中的异步编程,包括回调函数、Promise和async/await的使用。通过实例代码和解释,帮助读者更好地理解和应用这些技术。
32 3
|
1月前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。