异步发展流程 —— Promise 的基本使用

20-CUDA规约算法:并行求和优化策略-✨ 本文介绍了GPU上高效并行规约(Reduction)算法的优化技巧。规约是将大量数据合并为单个值的基础计算模式,广泛应用于科学计算等领域。文章从基础并行规约实现出发,逐步讲解了三种关键优化策略:1)交错寻址减少共享内存bank冲突;2)循环展开降低分支预测开销;3)多级规约处理大规模数据。性能对比显示,优化策略可带来最高4.5倍的加速效果。最后总结了最佳实践,包括合理使用共享内存、循环展开和warp级优化等技巧。这些优化方法可显著提升GPU计算密集型应用的性能。 阅读详情

在这里插入图片描述


阅读原文


Promise 简介

Promise 是 ES6 的新特性,提供了对 js 异步编程控制的新的解决方案,在过去书写异步代码时要靠回调函数,当异步操作依赖于其他异步操作的返回值时,会出现一种现象,被程序员们称为 “回调地狱”,即多层回调函数嵌套,这种代码的可读性、维护性都很差,因此诞生了 Promise,当然 Promise 并不是完全摆脱回调,而只是改变了传递回调的位置,大大减少了回调函数嵌套。


Promise 的使用

1、实例方法 then

Promise 中的代码默认是同步执行的,then 方法中的回调在微任务队列中执行,在 Promise 的 then 方法中支持传入两个参数,一个是成功的回调,一个是失败的回调,在 Promise 中调用了 resolve 方法,就会在 then 中执行成功的回调,调用了 reject 方法,就会在 then 中执行失败的回调,成功的回调和失败的回调只能执行一个,resolve 和 reject 方法调用时传入的参数会传递给 then 方法中对应的回调函数。

// 执行 resolve
let p = new Promise((resolve, reject) => {
    console.log(1);
    resovle(3);
});

console.log(2);

p.then(data => {
    console.log(data);
}, err => {
    console.log(err);
});

// 1
// 2
// 3
// 执行 reject
let p = new Promise((resolve, reject) => {
    reject();
});

p.then(() => {
    console.log(1);
}, () => {
    console.log(2);
});

// 2

如果 Promise 中发生错误,就会在 then 中执行失败的回调。

// 失败的回调
let p = new Primise((resolve, reject) => {
    throw new Error();
});

p.then(() => {
    console.log(1);
}, () => {
    console.log("报错啦");
});

// 报错啦

当同一个 Promise 实例的 then 方法多次调用时,就会多次执行。

// 多次调用 then
let p = new Promise((resolve, reject) => {
    resolve("成功");
});

p.then(data => {
    console.log(data);
});

p.then(data => {
    console.log(data);
});

// 成功
// 成功

2、Promise 的链式调用

Promise 支持链式调用,每次调用一次 then 方法都会返回一个新的 Promise实例,如果该 then 方法中执行的回调函数有返回值,并且这个返回值会作为返回的下一个 Promise 实例的 then 方法回调的参数,如果 then 方法的返回值是一个 Promise 实例,那就返回一个新的 Promise 实例,将 then 返回的 Promise 实例执行后的结果作为返回 Promise 实例回调的参数。

// 链式调用 then
function read(url) {
    return new Promise((resolve, reject) => {
        fs.readFile(url, "utf8", (err, data) => {
            if (err) reject(err);
            resolve(data);
        })
    });
}

read("1.txt").then(data => {
    // 假设此时读到的内容为 Hello world
    return data;
}, err => {
    console.log(err);
}).then(data => {
    console.log(data);
    // Hello world
}, err => {
    console.log(err);
});

read("1.txt").then(data => {
    // 假如此时读到的 1.txt 的内容为 2.txt 的字符串,2.txt 的内容为 Hello world
    return read(data);
}, err => {
    console.log(err);
}).then(data => {
    console.log(data);
    // Hello world
}, err => {
    console.log(err);
});

在 Promise 实例的 then 中如果有错误产生,在返回的新的 Promise 实例中的 then 方法中会执行错误的回调。

// 链式调用 then 出错
let p = new Promise((resolve, reject) => {
    resolve();
});

p.then(() => {
    console.log("success", 1);
    throw new Error();
}, () => {
    console.log("error", 1);
}).then(() => {
    console.log("success", 2);
}, () => {
    console.log("error", 2)
})

// success 1
// error 2

在 Promise 中有三个状态:

  • pending:等待态
  • fulfilled:成功态
  • rejected:失败态

Promise 实例的状态只能从 pending 到 fulfilled 或从 pending 到 rejected,状态一旦发生变化就不可逆,所以 Promise 实现链式调用与 jQuery 不同,返回的不是 this,只能是一个新的 Promise。

3、实例方法 catch

在 Promise 中实例的 catch 方法可以捕获链式调用中的异常,不需要每次调用 then 方法中都传入错误的回调,在链式调用的过程中只要有任何一个 then 中出现错误,都会被 catch 方法捕获到。

// catch 方法
let p = new Promise((resolve, reject) => {
    resolve();
});

p.then(() => {
    throw new Error();
    console.log("success", 1);
}).then(() => {
    console.log("success", 2);
}).catch(() => {
    console.log('出错了');
});

// 出错了

p.then(() => {
    console.log("success", 1);
}).then(() => {
    throw new Error();
    console.log("success", 2);
}).catch(() => {
    console.log('出错了');
});

// success 1
// 出错了

4、静态方法 Promise.all

Promise 中的静态方法 all 可以实现多个 Promise 实例的并行,当所有结果都为成功时,返回一个数组,该数组存储的为每一个 Promise 实例的返回结果,每一个 Promise 实例的返回顺序先后不固定,但是返回值的数组内存储每一个 Promise 的返回值的结果按照最初传入的顺序排列,all 方法的返回值为一个新的 Promise 实例,返回的数组作为返回新 Promise 的 then 方法成功回调的参数。

当 all 传入的参数数组中的 Promise 实例执行时,只要有一个失败,则直接返回该 Promise 实例失败的结果或错误信息。

// Promise.all 方法
let p1 = new Promise((resolve, reject) => {
    resolve(1);
});

let p2 = new Promise((resolve, reject) => {
    resolve(2);
});

Promise.all([p1, p2]).then(data => {
    console.log(data);
});

// [1, 2]
// Promise.all 错误捕获
let p1 = new Promise((resolve, reject) => {
    resolve(1);
});

let p2 = new Promise((resolve, reject) => {
    reject(2);
});

Promise.all([p1, p2]).then(data => {
    console.log(data);
}).catch(err => {
    console.log(err);
});

// 2

5、静态方法 Promise.race

Promise 的静态方法 race 的用法和 all 类似,参数同为一个存储 Promise 实例的数组,返回值同样是一个新的 Promise 的实例,不同的是,数组中的 Promise 实例只有一个结果为成功,那就直接返回这个结果(只取出最快返回的结果),在没有成功的结果之前有一个出错,就直接返回这个错误。

// Promise.race 方法
let p1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve(1), 2000);
});

let p2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve(2), 1000);

});

Promise.race([p1, p2]).then(data => {
    console.log(data);
}).catch(err => {
    console.log(err);
});

// 2
// Promise.race 错误捕获
let p1 = new Promise((resolve, reject) => {
    setTimeout(() => reject(1), 1000);
});

let p2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve(2), 2000);

});

Promise.race([p1, p2]).then(data => {
    console.log(data);
}).catch(err => {
    console.log(err);
});

// 1

6、静态方法 Promise.resolve

Promise 的静态方法 resolve 可以直接将 Promise 的状态变为成功并返回一个新的 Promise 实例,resolve 的参数会传递给返回的新 Promise 实例 then 中成功回调。

// Promise.resolve 方法
Promise.resolve('hello').then(data => {
    console.log(data);
});

// hello

7、静态方法 Promise.reject

Promise 的静态方法 reject 与 resolve 使用完全相同,都返回一个新的 Promise 实例,不同的是 reject 的参数会传递给新 Promise 实例的 then 方法失败回调。

// Promise.reject 方法
Promise.reject('出错了').then(null, err => {
    console.log(err);
});

// 出错了

当成功的回调不传递时,可以使用 null 代替,因为 null 作为参数会被忽略掉,将参数穿透到下一个 then 的回调中。


135、高通 ChromaTix 调优工具入门:参数含义、调优流程与效果对比 本文介绍了高通ChromaTix色彩调优工具的核心使用要点:1. ChromaTix是位于ISP管线中的色彩处理系统,核心任务是将原始色彩映射为符合人眼感知的"舒适"效果;2. 重点解析了饱和度、色调、亮度相关饱和度等关键参数的实际含义和调试陷阱;3. 分享了四步调优流程,强调需要基于多场景数据验证;4. 通过案例展示了参数调整带来的色彩改善效果;5. 总结了实用建议,包括保持单一变量调试、量化评估色差、关注极端场景表现等。文章指出ChromaTix调优是平衡不同场景需求的"妥协艺术",需要结合客观数据和主 阅读详情

相关推荐

ESD 防护深度解析:模型、等级、系统设计与防护策略

本文系统阐述了静电放电(ESD)防护的核心技术体系。首先对比分析了HBM(人体模型)和CDM(充电设备模型)两种基础ESD模型的物理特性、测试标准及分级要求,指出相同电压下CDM的破坏性是HBM的15-20倍。其次详细解析了IEC61000-4-2系统级ESD标准,包括接触/空气放电测试方法及判定等级。重点提出了系统级防护的三层架构:空间隔离(≥10mm间距)、电气隔离(地平面分割)和TVS管选型(响应时间<1ns),并对比了MOV、SCR等防护器件特性。针对不同应用场景(消费电子、工业控制等)给出了差异化

bother3000的博客 1882

Promise源码解析

Promise源码解析 纸上得来终觉浅,绝知此事要躬行。之前只是很浅显的知道Promise的用法,也大概猜测到它的内部是如何实现的。但是总是有一种不深究一下就不踏实的感觉。于是从npm上获得早期的Promise源代码,拿过来读一读,做一做笔记。 Promise的源码写的非常的巧妙,凭空阅读会陷入入其中无法自拔。 简单的Promise用法 一个简单的Promise用法如下: const promis...

SAHADEV的专栏 3114

Adams与matlab联合仿真的一些小技巧

Adams与simulink联合仿真之快速设置初值 去年到现在一直做的两个项目要用到Adams与simulnk联合仿真,虽然网上有很多这方面的教程,但都比较基本,要实现一些稍微复杂的要求就比较困难了,比如我需要改变模型的初始位姿,原来的方式是在adams中设置,再生成联合仿真需要的文件,再在matlab中进行调用和仿真,如果工况多的话这样就特别耗时耗力,进过长时间的摸索,终于找出了在matlab中直接改变Adams模型参数的方法,下面具体说明一下。 我这里的模型是一个小球通过弹簧连接在坐标原点,仿真开始后

weixin_40962901的博客 4785

Promise-github版

 https://github.com/sunshineqt/read-note-test/blob/master/src/Promise.md 转载于:https://www.cnblogs.com/haimengqingyuan/p/11427937.html

weixin_30299709的博客 250

全球、中国各省市县等行政区划(含十段线)shape及geosjon数据免费下载

免费下载全球、中国各省市县等行政区划(含十段线)shape及geosjon数据

mhf403445651的博客 3460

告别机载网络通信混乱:利用ARINC825的LCC与带宽管理机制构建高可靠CAN总线

本文深入探讨了ARINC825规范如何通过逻辑通信通道(LCC)和带宽管理机制解决机载CAN总线通信的混乱问题。文章详细解析了ARINC825的核心架构设计、LCC工程实现、时间触发带宽管理等关键技术,展示了其在提升航空电子系统可靠性和实时性方面的显著效果,为现代飞机通信系统提供了高可靠解决方案。

weixin_26878995的博客 241

Promise小结

基本用法 1声明一个Promise对象 // 方法1 let promise = new Promise ( (resolve, reject) => { if ( success ) { resolve(a) // pending ——> resolved 参数将传递给对应的回调方法 } else { reje...

github_39274378的博客 394

单片机按键识别篇---单击---双击----长按

  最近做一任务需要使用一个按键实现三种功能,分别是按键单击功能,按键双击功能和按键长按功能,可能之前没有接触过这类按键复用情况,顶多也只是简单识别单击和长按,没有想过双击以上按键功能,也是绞尽脑汁,想了半天,又上网看了些例程,算是对于按键的识别有点小小的了解,感觉这个功能挺实用,在此做个随笔。 一、思路   1.识别长按操作思路:我们使用系统定时器定时,然后让系统每过一段时间去扫描按键I/O...

weixin_30311605的博客 3660

温故知新(六九)const p1 = () => (new Promise((resolve, reject) => { console.log(1); let p2 = new Pr

写出输出结果: const p1 = () => (new Promise((resolve, reject) => { console.log(1); let p2 = new Promise((resolve, reject) => { console.log(2); const timeOut1 = setTimeout(() => { console.log(3); resol

MFWSCQ的博客 3185

使用MATLAB/Simulink搭建一个简化的无人机螺旋桨气动特性模型,并通过仿真验证其基本功能

螺旋桨概述特点:螺旋桨通过旋转产生推力,推动无人机前进或上升。关键参数直径(D):影响推力和功率消耗。螺距(P):定义了螺旋桨每转一圈理论上前进的距离。效率(η):衡量螺旋桨将机械能转化为推力的有效性。应用场景:航拍摄影、农业监测、物流配送等。仿真目标搭建一个简化的无人机螺旋桨气动特性模型,涵盖从电机输入到螺旋桨输出推力的过程。分析不同条件下的系统响应特性(如推力、功率消耗),并探讨优化螺旋桨设计的方法。定义螺旋桨的一些基本物理参数,如直径、螺距、推力系数、功率系数等。使用Constant。

xiaoheshang_123的博客 428

Python爬虫实战:抓取统计数据并生成年度对比图表详解

国家统计局网站(静态HTML页面Excel文件JSON接口(部分新版API)我们将重点演示从统计公报页面抓取数据,结合解析Excel文件,实现多种数据格式爬取处理。本文从零开始搭建了一个爬取国家统计数据并制作年度对比图表的完整流程。读者可以根据实际需求调整爬取目标,丰富数据分析维度,甚至结合机器学习模型预测未来趋势。欢迎你在评论区留言分享你的爬虫实践,或提出改进建议!

2201_76125261的博客 1000

JS 异步发展流程 —— Promise

实现一个自己的Promise库 在上一篇中我们介绍了整个js异步发展的过程,今天我们就来自己完成一个Promise库,可以参照Promise的实现规范 首先先搭一个最简单的Promise框架 function Promise(executor) { // executor是一个执行函数 let self = this; self.status = 'pending'; se...

weixin_34185364的博客 169

LeRobot 入门教程(二)强化学习训练及 SmolVLA 模型微调

本文介绍了LeRobot框架中基于人类在环的样本高效强化学习(HIL-SERL)工作流,包含真实机器人训练和模拟环境训练两大模块。在真实机器人部分,详细说明了从配置设置、工作空间边界确定、演示数据收集、奖励分类器训练到演员-学习者架构部署的全流程,并强调了人类干预的关键作用。同时介绍了适用于模拟训练的gym_hil环境及其配置使用方法。最后,文章提供了微调SmolVLA基础模型的指南,包括数据集收集、微调步骤和模型评估方法。该工作流实现了人机协作的高效强化学习,适用于各类机器人操作任务。

2506_90492529的博客 3897

异步发展流程 —— 手写一个符合 Promise/A+ 规范的 Promise

原文出自:https://www.pandashen.com 概述 Promise 是 js 异步编程的一种解决方案,避免了 “回调地狱” 给编程带来的麻烦,在 ES6 中成为了标准,这篇文章重点不是叙述 Promise 的基本用法,而是从零开始,手写一版符合 Promise/A+ 规范的 Promise,如果想了解更多 Promise 的基本用法,可以看 异步发展流程 —— Promise...

github_38140984的博客 382

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

异步函数发展史:Promise对象,Generator函数,Thunk函数和自动流程管理

异步函数发展史:Promise对象,Generator函数,Thunk函数和自动流程管理 文章目录异步函数发展史:Promise对象,Generator函数,Thunk函数和自动流程管理1、回调地狱2、Promise对象3、Promise对象 + Generator函数4、Promise对象 + Generator函数 + 基于Thunk函数的自动化流程管理4.1、Thunk函数4.2、基于Thunk函数的Generator函数自动化流程管理5、Promise对象 + Generator函数 + 基于Pro

Czuaphe的博客 426

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

关于Promise的九深一浅

Promise详解 异步流程的发展过程 之前处理异步流程最常用的就是回调,它的好处是非常容易理解,事件1执行完之后,成功执行事件1的回调,即开始事件2的执行,但是缺点是特别容易造成回调地狱,代码难以维护。 随后Promise出现了,它是抽象异步处理对象以及对其各种操作的组件 其后出现了generator函数,用*修饰函数搭配yield的语法,搭配co(自动执行完迭代器方法)会更方便快捷 随着时代...

weixin_33739541的博客 311

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JavaScript 异步流程控制

来源|https://github.com/cheogo/learn-javascript本文主要讲解 JavaScript 在异步流程控制中的一些实践、容错以及复杂异步环境下我们该如...

web前端开发 173

【JS】993- JavaScript 异步流程控制

来源|https://github.com/cheogo/learn-javascript本文主要讲解 JavaScript 在异步流程控制中的一些实践、容错以及复杂异步环境下我们该如...

pingan8787 376

JS异步解决方案的发展历程以及优缺点

JS 异步已经告一段落了,这里来一波小总结 1. 回调函数(callback) setTimeout(() => { // callback 函数体 }, 1000) 缺点:回调地狱,不能用 try catch 捕获错误,不能 return 回调地狱的根本问题在于: 缺乏顺序性: 回调地狱导致的调试困难,和大脑的思维方式不符 嵌套函数存在耦合性,一旦有所改动,就会牵一发而动全身,...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 2986

promise异步发展史

异步介绍 异步简单来说就是做一件事时,做到一半可能需要等待系统或服务处理之后才会得到响应和结果,此时可以转去做另一件事,等到获得响应之后在去执行剩下一半的事情。反之同步就是一直等到响应然后接着做事,中间不会跳去做别的事。 异步发展史可以简单归纳为 callback Promise generator + co async + await JS 中最基础的异步调用方式是callback,它将...

weixin_34055910的博客 427

promise实现过程

异步发展流程: callback-> promise -> generator -> async + await promise实现过程: 例子: p1.then((res) => { return new Promise((resolve ,reject)=>{ return new Promise((resolve,reject)=&gt...

weixin_33845477的博客 174

浅析异步的发展过程

异步的发展过程 第一个阶段:回调函数(callback)。一层一层的嵌套,会产生回调地狱,可读性不强,不便于后期维护 第二个阶段:promise。ES6提出的。promise对象,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败),用then方法来指定resolved(成功)状态的回调函数,用catch方法指定rejected(失败)状态的回调函数。有两特征:1、状态不受外界影响;2、一旦状态改变,就不会再变,任何时候都可以得到这个结果 第三个阶段:g

m0_52602525的博客 317

如何使用Promise进行异步处理?

如何使用Promise进行异步处理?

商务合作欢迎私信我 1万+

promise对象基本使用。——使用同步流程表示异步操作

0.为什么要介绍promise 因为js是串行,单线程语言。是同步流程,代码只能顺序执行。(详见:简述进程、线程、串行、并行基本概念,便于快速理解) 企业开发中为了保存异步代码的执行顺序, 那么就会出现回调函数层层嵌套 如果回调函数嵌套的层数太多, 就会导致代码的阅读性, 可维护性大大降低 promise对象可以将异步操作以同步流程来表示, 避免了回调函数层层嵌套(回调地狱) 顺序打印:1,2,...

Cao_Mary的博客 1217

JavaScript异步与Promise基本用法(resolve与reject)

Promise解决的问题 相信每个前端都遇到过这样一个问题,当一个异步任务的执行需要依赖另一个异步任务的结果时,我们一般会将两个异步任务嵌套起来,这种情况发生一两次还可以忍,但是发生很多次之后,就形成了所谓的回调地狱,代码层层嵌套,环环相扣,很明显,逻辑稍微复杂一些,这样的程序就会变得难以维护。就比如我们昨天的那个回调地狱的例子: function funA(callback) { consol...

qq_42911663的博客 2万+

使用Promise将异步转化为同步执行

PROMISE promise是一个容器,保存着某个未来才会结束的事件(异步操作)的结果。 promise有三种状态:pending(进行中)、fulfilled(成功)和reject(失败),只有异步操作的结果可以改变promise的状态。一旦promise从pending状态转化为fulfilled或reject后就不会再改变。 1. 新建一个Promise Promise在新建后就会立即执行,Promise.then()方法会在当前脚本所有同步任务执行完后才会执行 const promise

weixin_45987920的博客 2万+
上一篇: 九种 “姿势” 让你彻底解决跨域问题
下一篇: 异步发展流程 —— 手写一个符合 Promise/A+ 规范的 Promise
Panda Shen
博客等级 码龄10年 18粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值