JavaScript笔记-浏览器[下]

news/2026/1/16 17:23:49/文章来源:https://www.cnblogs.com/qiqimachatmk/p/19493171

注意:本篇学习笔记基于原网站: JavaScript教程 - 廖雪峰的官方网站
笔记仅作学习留档使用

本篇目录

Promise
async函数
Canvas(HTML5新增)

Promise

JavaScript的代码只能单线程执行,所以所有相关的网路操作和炼器时间都需要异步执行。异步执行可以用回调函数实现(AJAX就是典型的异步操作)

request.onreadystatechange = function () {if (request.readyState === 4) {if (request.status === 200) {return success(request.responseText);} else {return fail(request.status);}}
}↓ 更好的写法
// 先统一执行AJAX逻辑
let ajax = ajaxGet('http://...');
// 根据结果操作
ajax.ifSuccess(success).ifFail(fail);

这种“承诺将来会执行”的对象在JavaScript中称为Promise对象,有各种开源实现,在ES6中被统一规范,由浏览器直接支持。

在说明运行方法前,先简单介绍一下promise,它本身只有有三种状态

const promise = {state: "pending",  // 初始状态:进行中// 要么变成:"fulfilled"(成功)// 要么变成:"rejected"(失败)value: null,      // 成功时的值reason: null      // 失败时的原因
};

常用的方法(以点外卖举例)

方法 作用 比喻
.then() 成功时做什么 外卖到了之后...
.catch() 失败时做什么 外卖出问题时...
.分别() 无论成功失败都做 最后都要收拾桌子
Promise.all() 等所有都完成 等所有外卖都到齐
Promise.race() 谁先完成用谁 哪个外卖先到先吃哪个
Promise.resolve() 创建已成功的 Promise 已经有现成的食物
Promise.reject() 创建已失败的 Promise 直接拒绝订单

以买披萨外卖举例:

// 外卖的三个状态
const pizzaPromise = new Promise((resolve, reject) => {// 1. 初始状态:pending(订单已接收,正在制作)console.log("商家已接单,开始制作披萨...");setTimeout(() => {const isSuccess = Math.random() > 0.3;if (isSuccess) {// 2. 成功状态:fulfilled(披萨做好了)resolve("🍕 披萨做好了!");} else {// 3. 失败状态:rejected(制作失败了)reject("🔥 烤箱坏了,披萨糊了!");}}, 2000);
});// 处理结果
pizzaPromise.then(result => {console.log("成功:", result);console.log("我下楼取餐");}).catch(error => {console.log("失败:", error);console.log("我重新点一家");}).finally(() => {console.log("不管成功失败,我都要收拾桌子");});

有了执行函数,我们就可以用一个Promise对象来执行它,并在将来某个时刻获得成功或失败的结果。

除去基本的异步,还有一些额外的功能:

Promise.all()- 等所有外卖都到了再开饭

// 同时点披萨、可乐、薯条
const pizza = orderPizza();     // Promise
const cola = orderCola();       // Promise  
const fries = orderFries();      // Promise// 等三个都到了
Promise.all([pizza, cola, fries]).then(foods => {console.log("所有外卖都到了:", foods);// foods是数组:["🍕", "🥤", "🍟"]console.log("可以开饭了!");}).catch(error => {console.log("有一样没到,吃不了饭:", error);});

Promise.race()- 哪个外卖先到先吃哪个

// 同时点三家店的外卖,谁先到吃谁的
const kfc = orderKFC();      // 预计30分钟
const mcd = orderMcDonalds(); // 预计20分钟
const pizzaHut = orderPizzaHut(); // 预计25分钟Promise.race([kfc, mcd, pizzaHut]).then(fastestFood => {console.log(fastestFood + " 先到了!");console.log("先吃这个垫垫肚子");});
// 如果是麦当劳先到,就打印:"麦门先到了^^"

Promise.resolve()- 假装点了外卖

// 有时候我们已经有东西了,但还想用Promise的格式
const instantNoodle = Promise.resolve("泡面");  // 泡面已经有了instantNoodle.then(food => console.log("吃:" + food));
// 立即输出:"吃:泡面"```
Promise.reject()- 假装外卖"秒拒"
```const failedOrder = Promise.reject("没钱付款");failedOrder.catch(reason => console.log("失败原因:" + reason));
// 立即输出:"失败原因:没钱付款"

async函数

关键字 async 配合 await 调用Promise实现异步操作,可以实现同步写法类似的代码

async function get(url) {let resp = await fetch(url);let result = await resp.json();return result;
}
  • async function 可以定义一个异步函数,在函数内部,用 await 调用另一个异步函数,执行起来是异步的
let resp = await fetch(url);||等价于let promise = fetch(url);
promise.then((resp) => {// 拿到resp
});

对于catch()功能,可以调用await直接使用try { … } catch实现。

async function get(url) {try {let resp = await fetch(url);let result = await resp.json();return result;} catch (e) {// 出错了}
}

注意await调用必须在async function中,对于同步函数,需要调用async function时,不可以使用await。可以直接调用函数获得Promise对象,后面加上then()catch()获取结果。

Canvas(HTML5新增)

实现在不借助Flash插件的情况下用JavaScript在绘制各种图表、动画等。
一个Canvas定义了一个指定尺寸的矩形框,在这个范围内我们可以随意绘制

<canvas id="test-canvas" width="300" height="200"></canvas>

通常在 <canvas> 内部添加一些说明性HTML代码,如果浏览器不支持Canvas,它将显示 <canvas> 内部的HTML。

获取画笔

getContext('2d') 方法会拿到一个 CanvasRenderingContext2D 对象,所有的绘图操作都需要通过这个对象完成

// 获取画布元素
const canvas = document.getElementById('myCanvas');// 2D绘图上下文用笔
const ctx = canvas.getContext('2d');// 也有3D的,但更复杂(本节不讲这个)
const gl = canvas.getContext('webgl');

绘制图形

Canvas的坐标以左上角为原点,水平向右为X轴,垂直向下为Y轴,以像素为单位,所以每个点都是非负整数

绘制矩形

// 1. 填充矩形(实心)
ctx.fillStyle = 'red';     // 设置填充颜色
ctx.fillRect(50, 50, 200, 100);  // (x, y, 宽度, 高度)// 2. 描边矩形(空心)
ctx.strokeStyle = 'blue';  // 设置边框颜色
ctx.lineWidth = 5;         // 设置边框粗细
ctx.strokeRect(100, 100, 150, 80);// 3. 清除矩形区域
ctx.clearRect(80, 80, 100, 50);  // 擦除这块区域

绘制路径(画线、形状)

// 开始一条新路径
ctx.beginPath();// 移动到起点(不提笔移动)
ctx.moveTo(100, 100);// 画线到某点
ctx.lineTo(200, 150);
ctx.lineTo(150, 200);// 画圆形
ctx.arc(300, 300, 50, 0, Math.PI * 2);  // (圆心x, 圆心y, 半径, 起始角度, 结束角度)// 闭合路径(回到起点)
ctx.closePath();// 设置样式
ctx.strokeStyle = 'green';
ctx.lineWidth = 3;
ctx.fillStyle = 'rgba(255, 0, 0, 0.5)';  // 带透明度// 绘制
ctx.stroke();  // 描边
ctx.fill();    // 填充

绘制文本

// 设置文字样式
ctx.font = 'bold 30px Arial';  // 粗细 大小 字体
ctx.fillStyle = 'black';
ctx.textAlign = 'center';  // 对齐方式:left, center, right
ctx.textBaseline = 'middle';  // 基线:top, middle, bottom// 绘制填充文字
ctx.fillText('Hello Canvas', 400, 50);// 绘制空心文字
ctx.strokeText('Hello Canvas', 400, 100);

Canvas除了能绘制基本的形状和文本,还可以实现动画、缩放、各种滤镜和像素转换等高级操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1169204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PON网络中三业务 VLAN 规划与转发全流程

三业务&#xff08;上网IPTV语音&#xff09;VLAN规划与转发全流程 以家庭用户接入场景为例&#xff0c;采用 灵活QinQ 技术&#xff0c;实现上网、IPTV、语音三类业务的隔离转发&#xff0c;涉及设备&#xff1a;用户终端→ONU→OLT→BRAS/IPTV核心网/IMS语音网。 一、 业务…

mysql in相关的知识

MySQL 会先对in子查询结果去重, 会启用using <auto_distinct_key>&#xff0c;生成临时的去重键&#xff0c;把 [1,1,2] 变成 [1,2]

【TOMCAT】IDEAL社区版中使用maven搭建的项目配置本地tomcat方法

ideal社区版中很多功能是没有的&#xff0c;属于正版的精简版本。在用maven工具做web项目时&#xff0c;我们需要tomcat服务器跑页面的时候&#xff0c;就难办了&#xff01; 配置流程打开设置找到plugins搜索smart tomcat回到ideal开发页面 项目的打包方式必须是war包进入edit…

寻找Exchange的国产替代?U-Mail邮件服务器软件值得一试 - U-Mail邮件系统

在数字化办公的当下,企业邮箱已远非简单的通信工具,而是企业承载业务流程、知识资产与对外形象的关键设施。其稳定性与安全性,直接关系到企业日常运转的效率与信誉。因此,许多企业开始摒弃传统的租用第三方企业邮箱…

PCB企业出海案例赏析:盘古信息IMS赋能客户实现高效协同与快速投产

近年来&#xff0c;随着全球供应链格局变化&#xff0c;越来越多中国PCB企业选择在东南亚等地建设海外生产基地&#xff0c;以贴近客户、优化成本、提升交付能力。然而&#xff0c;新工厂从“建成”到“高效运行”&#xff0c;往往面临系统割裂、标准不一、经验难复用等现实挑战…

【Servlet】servlet开发的基础教程配置一

项目配置 打包方式是war包<packaging>war</packaging>基础依赖 <dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>…

快捷支付高并发适配与智能风控优化方案

针对支付宝、微信支付高频出现的风控拦截问题&#xff0c;可接入银联支付通道API接口&#xff0c;实现快捷支付与多应用系统的灵活对接。接口覆盖主流银行借记卡及超100家银行信用卡&#xff0c;用户首次交易仅需完成四要素校验&#xff0c;后续一键支付&#xff1b;交易额度上…

企业选型必读:2026年WMS市场趋势、核心厂商推荐与选型指南

据Gartner最新发布的《2025全球仓储管理软件&#xff08;WMS&#xff09;市场报告》显示&#xff0c;到2026年&#xff0c;全球WMS市场规模预计将突破85亿美元&#xff0c;年复合增长率达12.3%&#xff0c;其中制造业对智能WMS的需求增速位居各行业之首。在制造业加速推进数智化…

ISTA3A结合NMPA/FDA/MDR:医疗包装运输测试核心指南

ISTA3A是国际安全运输协会&#xff08;ISTA&#xff09;制定的通用模拟运输测试标准&#xff0c;适用于70kg&#xff08;150lb&#xff09;及以下的单个包裹产品&#xff0c;涵盖标准、小型、扁平、细长四种常见包装类型。该标准通过模拟运输过程中的温湿度、振动、冲击、低气压…

RK3588硬核实战:YOLOv11驱动SAR船舶分割,NPU加速全流程落地指南

RK3588硬核实战&#xff1a;YOLOv11驱动SAR船舶分割&#xff0c;NPU加速全流程落地指南 在海洋监测、海事安防等领域&#xff0c;SAR&#xff08;合成孔径雷达&#xff09;影像凭借全天时、全天候的成像能力成为核心数据源&#xff0c;而船舶分割作为SAR影像解译的关键任务&…

系统监控异常告警2.0版本之nacos服务监控

背景&#xff1a; 昨天写了一篇关于系统监控异常告警2.0版本&#xff0c;他是基于你的SpringBoot项目开启了CG相关的配置。但是&#xff0c;有两种情况还需要考虑。 那我没有开启相关配置怎么办&#xff1f; 虽开启了配置&#xff0c;服务没有触发GC&#xff0c;但nacos的健康…

Python全栈项目--智能客服机器人的设计与实现

项目概述 随着人工智能技术的快速发展&#xff0c;智能客服机器人已经成为企业提升服务效率、降低运营成本的重要工具。本文将详细介绍如何使用Python技术栈从零开始构建一个功能完善的智能客服机器人系统&#xff0c;涵盖前端界面、后端服务、自然语言处理以及数据存储等各个…

导师推荐!专科生必备8款AI论文网站测评

导师推荐&#xff01;专科生必备8款AI论文网站测评 为什么需要这份AI论文网站测评&#xff1f; 随着人工智能技术的快速发展&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的论文辅助平台&#xff0c;如何选择真正适合自己的…

ACPI!ACPIBuildProcessRunMethodPhaseRunMethod函数对_SB总线_INT方法的调用

ACPI!ACPIBuildProcessRunMethodPhaseRunMethod函数对_SB总线_INT方法的调用//// Call the function//status (buildFunction)( buildRequest ); 调用下一步&#xff1a;0: kd> g Breakpoint 5 hit eax00000004 ebx00000004 ecx89906e40 edx00000001 esi89906e30 edi80b…

大模型增强之道:RAG技术详解与应用实践

本文系统解读了《A Survey on Knowledge-Oriented Retrieval-Augmented Generation》论文&#xff0c;详细介绍了RAG&#xff08;检索增强生成&#xff09;技术如何解决传统语言模型无法动态访问外部知识的局限。文章全面解析了RAG的核心组件、关键步骤&#xff08;用户意图理解…

ACPI!ACPIBuildProcessRunMethodPhaseCheckSta函数对_SB总线的状态的确定

ACPI!ACPIBuildProcessRunMethodPhaseCheckSta函数对_SB总线的状态的确定 0: kd> kc# 00 ACPI!ACPIGet 01 ACPI!ACPIBuildProcessRunMethodPhaseCheckSta 02 ACPI!ACPIBuildProcessGenericList 03 ACPI!ACPIBuildDeviceDpc 04 nt!KiRetireDpcList 05 nt!KiDispatchInterrupt…

Java毕设项目:基于SpringBoot+Vue的中青年人员招聘平台(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

无人机螺距设计要点与技术解析

无人机螺距设计的核心&#xff0c;是在拉力、效率和飞行速度之间找到最佳平衡。你需要先明确无人机的用途&#xff0c;然后针对性地选择桨叶尺寸与螺距&#xff0c;有时还需考虑采用变桨距等高级技术。螺旋桨核心参数与设计选择首先是桨叶的关键参数&#xff1a;直径&#xff1…

表驱动法:告别 if-else(案例:查月份天数、成绩分级)

把「输入→输出」的对应关系做成一张 “表”&#xff08;数组 / 哈希表都行&#xff09;&#xff0c;不用写一堆条件判断&#xff0c;直接拿输入当索引去表里查结果#include<stdio.h>#define MONTH_COUNT 12 #define GRADE_COUNT 11int is_leap_year(int year); int get_…

协同过滤算法 基于django框架和python的 在线音乐推荐系统的设计与实现

目录 协同过滤算法在在线音乐推荐系统中的设计与实现 关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 协同过滤算法在在线音乐推荐系统中的设计与实现 基于Django框架和Python的在…