首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaScript 中回调、Promise 和 AsyncAwait 的代码案例

本文将通过代码示例展示如何使用基于回调的 API,然后将其改成使用 Promises,最后再用 Async/Await 语法。本文不会详细解释回调、promise 和 Async/Await 语法。...有关这些概念的详细解释,请查看 MDN 的 Asynchronous JavaScript[1],它解释了什么是异步性以及如何用回调、promise 和 Async/Await 语法处理异步 JavaScript...如果你对 JavaScript 中的异步有一定的了解,但需要一个直观的代码案例作为参考,那么本文就是给你准备的。...出于演示目的,我们将使用 fs.readFile[2],这是一个基于回调的用于读取文件的 API。...node script.js 命令执行脚本,会在终端上输出“Beam me up, Scotty”: $ node script.js Beam me up, Scotty [callback] 对于回调的写法

1.5K20

传统的回调函数与 ES6中的promise回调以及 ES7 的asyncawait终极的异步同步化

目录 传统的回调函数封装 ES6中的promise 异步同步化(终极) ---- 传统的回调函数封装 js中的回调函数的理解:回调函数就是传递一个参数化函数,就是将这个函数作为一个参数传到另外一个主函数里面...第一种 catch 方法可以捕获到 catch 之前整条 promise 链路上所有抛出的异常。 第二种 then 方法的第二个参数捕获的异常依赖于上一个 Promise 对象的执行结果。...第一种链式写法,使用catch,相当于给前面一个then方法返回的promise 注册回调,可以捕获到前面then没有被处理的异常。第二种是回调函数写法,仅为为上一个promise 注册异常回调。...如果是promise内部报错 reject 抛出错误后,then 的第二个参数就能捕获得到,如果then的第二个参数不存在,则catch方法会捕获到。...如果是then的第一个参数函数 resolve 中抛出了异常,即成功回调函数出现异常后,then的第二个参数reject 捕获捕获不到,catch方法可以捕获到。

1.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Promise机制

    从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doom),绝对是一种糟糕的编程体验。...于是便有了 CommonJS 的 Promises/A 规范,用于解决回调金字塔问题。 回调金字塔 那么何为回调金字塔呢?简单的讲就是回调里面嵌套回调。...链中的对象解决,而 [[Resolve]](promise, thenable) 的递归性质又使得其被再次调用,根据上述的算法将会陷入无限递归之中。...此外,在 Promises/A 规范中,由 then 方法生成的 Promise 对象是已执行还是已拒绝,取决于由 then 方法调用的那个回调是返回值还是抛出错误。...在 JQuery 的 Promise 对象的回调中抛出错误是个糟糕的主意,因为错误不会被捕获。

    1.4K100

    Promises机制

    从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doom),绝对是一种糟糕的编程体验。...于是便有了 CommonJS 的 Promises/A 规范,用于解决回调金字塔问题。 回调金字塔 那么何为回调金字塔呢?简单的讲就是回调里面嵌套回调。...链中的对象解决,而 [[Resolve]](promise, thenable) 的递归性质又使得其被再次调用,根据上述的算法将会陷入无限递归之中。...此外,在 Promises/A 规范中,由 then 方法生成的 Promise 对象是已执行还是已拒绝,取决于由 then 方法调用的那个回调是返回值还是抛出错误。...在 JQuery 的 Promise 对象的回调中抛出错误是个糟糕的主意,因为错误不会被捕获。

    72940

    Promise机制详解

    从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doom),绝对是一种糟糕的编程体验。...于是便有了 CommonJS 的 Promises/A 规范,用于解决回调金字塔问题。 回调金字塔 那么何为回调金字塔呢?简单的讲就是回调里面嵌套回调。...如果 then 不是函数,以 x 为参数执行 promise 如果 x 不为对象或者函数,以 x 为参数执行 promise 如果一个 promise 被一个循环的 thenable 链中的对象解决,...此外,在 Promises/A 规范中,由 then 方法生成的 Promise 对象是已执行还是已拒绝,取决于由 then 方法调用的那个回调是返回值还是抛出错误。...在 JQuery 的 Promise 对象的回调中抛出错误是个糟糕的主意,因为错误不会被捕获。 最后一个例子揭示了,实现 Promise 的关键是实现好 doResolve 方法,在完事以后触发回调。

    1.5K70

    JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 asyncawait 更好地编码方式!

    有不少的文章和教程上开始使用异步JavaScript代码,建议用setTimeout(回调,0),现在你知道事件循环和setTimeout是如何工作的:调用setTimeout 0毫秒作为第二个参数只是推迟回调将它放到回调队列中...将被拒绝,传递给 then(…) 的第二个回调错误处理程序将从 Promise 接收失败的信息。...的回调显然不会将问题报告给不存在的链接 Promise 。...Promise 对象的回调链,不管以 then 方法或 catch 方法结尾,要是最后一个方法抛出错误,都有可能无法捕捉到(因为 Promise 内部的错误不会冒泡到全局)。...因此,我们可以提供一个 done 方法,总是处于回调链的尾端,保证抛出任何可能出现的错误。 ? ES8中改进了什么 ?

    3.1K20

    一看就会、一写就废的 Promise 实现

    _immediateFn 回调函数放到了事件循环队列里面来执行 这里的 deferred 对象存放了当前的 onFulfilled 和 onRejected 回调函数和下一个 promise 对象。...情景 3:当前对象的 onFulfilled 和 onRejected,如果存在时,则执行自己的回调; pro.then(data => data).then(data => data).catch(err...=> {}); // 错误写法: 第二个 then 方法的 data 为 undefined 如果 onFulfilled 和 onRejected 回调不存在,则执行下一个 promise 的回调并携带当前的...当 reject 时,会优先执行第一个 Promise 的 onRejected 回调函数,catch 是在下一个 Promise 对象上的捕获错误方法: pro.then(data => data,err...).then() all 等待所有的 Promise 都执行完毕,才会执行 Promise.all().then() 回调,只要其中一个出错,则直接进入错误回调,因为对于所有 all 中 promise

    50520

    从0到1实现Promise前言正文结束

    实现catch()方法 then()方法的onFulfilled和onRejected回调函数都不是必传项,如果不传,那么我们就无法接收reject(reason)中的错误,这时我们可以通过链式调用catch...总结来说,then()方法中不传onRejected回调,Promise内部会默认帮你写一个函数作为回调,作用就是throw抛出reject或者try...catch到的错误,然后错误reason会被promise2...所以,我们在写Promise的链式调用的时候,在then()中可以不传onRejected回调,只需要在链式调用的最末尾加一个catch()就可以了,这样在该链条中的Promise发生的错误都会被最后的...有的同学可能会有疑问,如果catch中的回调执行也发生错误该怎么办呢,这个我们后续在Promise异常处理中再做讨论。 打印结果: reason3 123 8....(value) { a.b = 2; }); 复制代码 这里a不存在,所以给a.b赋值是一个语法错误,onFulfilled回调函数是包在try...catch中执行的,错误会被catch到,但是由于后面没有

    1K30

    动图学JS异步: Promises & AsyncAwait

    在上面示例中,我们只是简单的传递了一个回调函数给Promise的构造器,但是实际上这个回调函数接受两个参数,第一个参数我们称为resolve或者简称res,这个方法是当这个promise应该被resolve...因此在getImage示例中,我们可以链式调用多个then方法,把处理过的image对象传入到下一个回调。这样我们就彻底甩脱了回调地狱,得到一个整洁的链式回调。 ? 完美!...我们看到promise属于微任务队列,当一个promise执行resolve方法后,然后调用它的then()、catch()、finally()方法,在这些方法中的回调都将被添加到microtask queue...这也意味着then、catch、finally方法内的回调不会马上执行,本质上对于我们的javascript代码来说增加了异步的行为。 所以, then、catch、finally回调什么时候执行?...在这段代码中,我们macrotasks的setTimeout和microtasks的promise then回调。一旦事件循环执行到setTimeout函数的时候。

    1.1K20

    函数式编程中的数组问题

    在函数式数组的遍历中只要使用return结束当前回调的执行就行啦。...和continue不同,break关键词会结束整个循环,forEach传的回调函数永远会执行列表的长度遍,所以forEach没用,同理map和filter等一系列数组遍历方法都不能用。...取代无限循环语句只要递归调用自己就好啦~ // 无限循环语句 while(true){} // 无限循环表达式 (function loop(){ loop(); })(); 异步循环(划重点...tasks.forEach(async (task)=>{ await task(); }) 使用forEach,回调函数虽然是异步的,但是这个回调函数在一瞬间被并发执行了n次,每一次之间没有等待,...追根揭底,forEach无法顺序执行异步任务的原因是,回调函数每次执行完全独立,没有关联。贯穿Array原型链上几十种遍历方法中,似乎只有reduce和sort等寥寥几个方法可以实现前后关联。

    2K20

    从0到1实现Promise

    实现catch()方法 then()方法的onFulfilled和onRejected回调函数都不是必传项,如果不传,那么我们就无法接收reject(reason)中的错误,这时我们可以通过链式调用catch...总结来说,then()方法中不传onRejected回调,Promise内部会默认帮你写一个函数作为回调,作用就是throw抛出reject或者try...catch到的错误,然后错误reason会被promise2...所以,我们在写Promise的链式调用的时候,在then()中可以不传onRejected回调,只需要在链式调用的最末尾加一个catch()就可以了,这样在该链条中的Promise发生的错误都会被最后的...有的同学可能会有疑问,如果catch中的回调执行也发生错误该怎么办呢,这个我们后续在Promise异常处理中再做讨论。 打印结果: reason3 123 8....(value) { a.b = 2; }); 这里a不存在,所以给a.b赋值是一个语法错误,onFulfilled回调函数是包在try...catch中执行的,错误会被catch到,但是由于后面没有

    94610

    深入浅析Node.js中的异步

    close callbacks 阶段:执行 socket 的 close 事件回调 每个阶段都有一个先入先出的(FIFO)的用于执行回调的队列,事件循环运行到每个阶段,都会从对应的回调队列中取出回调函数去执行...然后事件循环就会进入下一个阶段,然后又从下一个阶段对应的队列中取出回调函数执行,这样反复直到事件循环的最后一个阶段。而事件循环也会一个一个按照循环执行,直到进程结束。...rejected 状态的 Promise 会回调后面的第一个 .catch 任何一个 rejected 状态且后面没有 .catch 的 Promise,都会造成浏览器/ Node 环境的全局错误..., 800) 执行 then 和 catch 会返回一个新 Promise,该 Promise 最终状态根据 then 和 catch 的回调函数的执行结果决定 如果回调函数最终是 throw,该 Promise...await 关键字可以“暂停” async function 的执行 await 关键字可以以同步的写法获取 Promise 的执行结果 try-catch 可以获取 await 所得到的错误

    1.3K30

    JavaScript 异步编程

    Untitled 0.png Promise异步方案 常见的异步方案就是通过回调函数来实现,导致回调地狱的问题,CommonJS社区提出了Promise方案并在ES6中采用了。...链式调用注意一下几点 Promise对象的then方法会返回一个全新的Promise对象 后面的then方法就是在为上一个then返回的Promise注册回调 前面then方法中回调函数的返回值会作为后面...then方法回调的参数 如果回调中返回的是Promise,那后面then方法的回调会等待它的结束 Promise异常处理 Promise 执行过程中出现错误onRejected回调会执行,一般通过catch...("catch",err); }); console.log('end'); 推荐使用catch方法作为错误的回调,不推荐使用then方法的第二个参数作为错误回调,原因如下: 当我们在收到正确的回调又返回一个...Promise对象但是在执行过程中出现了错误,而这时无法收到错误回调的。

    1.2K10

    使用Promise告别回调函数

    等该进程处理完这个任务后,会将该任务添加到渲染进程的消息队列中,并排队等待循环系统的处理。排队结束之后,循环系统会取出消息队列中的任务进行处理,并触发相关的回调操作。...在 excutor 函数中调用 resolve 函数时,会触发 promise.then 设置的回调函数;而调用 reject 函数时,会触发 promise.catch 设置的回调函数。...现在我们知道了 Promise 通过回调函数延迟绑定和回调函数返回值穿透的技术,解决了循环嵌套。回顾了 Web 页面是单线程架构模型,这种模型决定了我们编写代码的形式——异步编程。...接下来我们试着把一些不必要的回调接口封装起来,简单封装取得了一定的效果,不过,在稍微复制点的场景下依然存在着回调地狱的问题。...Promise 通过回调函数延迟绑定、回调函数返回值穿透和错误“冒泡”技术解决了上面的两个问题。

    8820

    Promise对象

    如果在executor函数中抛出一个错误,那么该promise状态为rejected,executor函数的返回值被忽略。 状态 pending: 初始状态,既不是成功,也不是失败状态。...缺点:无法取消Promise,一旦新建它就会立即执行,无法中途取消;如果不设置回调函数,Promise内部抛出的错误,不会反应到外部;当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成...,它会把iterable里第一个触发失败的promise对象的错误信息作为它的失败错误信息。...Promise.race([p1, p2]).then((result) => { console.log(result) // p1先获得结果,那么就执行p1的回调 }).catch((error...不要在解析为自身的thenable上调用Promise.resolve,这将导致无限递归,因为它试图展平无限嵌套的promise。

    56910

    ES6-标准入门·异步编程 Promise

    异步操作 reject 抛出的错误和 then 方法回调函数在运行中抛出的错误,都会被 catch 方法捕获。...也就是说,错误总是会被下一个 catch 语句捕获。 一般说来,不要在 then 方法中定义 Rejected 状态的回调函数(即 then 的第二个参数),而应总是使用 catch 方法。...跟传统的 try/catch 代码块不同的是,如果没有使用 catch 方法指定错误处理的回调函数,Promise 对象抛出的错误不会传递到外层代码,即不会有任何反应。...Error: test 上面的代码中,Promise 指定在下一轮“事件循环”再抛出错误。...done() 无论 Promise 对象的回调链以 then 方法还是 catch 方法结尾,只要最后一个方法抛出错误,都有可能无法捕捉到(因为 Promise 内部的错误不会冒泡到全局)。

    38930

    可视化的 js:动态图演示 Promises & AsyncAwait 的过程!

    因为写了许多嵌套的回调函数,这些回调函数又依赖于前一个回调函数,这通常被称为 回调地狱。 幸运的,ES6 中的 Promise 的能很好的处理这种情况!...有趣的是,我让(Jake Archibald)校对了这篇文章,他实际上指出 Chrome 中存在一个错误,该错误当前将状态显示为 “ fulfilled” 而不是 “ resolved”。...当一个 Promise 解决 (resolve) 并且调用它的 then()、catch() 或 finally() 方法的时候,这些方法里的回调函数被添加到微任务队列!...那么什么时候执行 then(),catch(),或 finally() 内的回调呢? 事件循环给与任务不同的优先级: 当前在调用栈 (call stack) 内的所有函数会被执行。...(微任务自己也能返回一个新的微任务,有效地创建无限的微任务循环 ) 如果调用栈和微任务队列都是空的,事件循环会检查宏任务队列里是否还有任务。

    2.1K10

    阿里前端常考面试题汇总

    六十四位中符号位占一位,整数位占十一位,其余五十二位都为小数位。因为 0.1 和 0.2 都是无限循环的二进制了,所以在小数位末尾处需要判断是否进位(就和十进制的四舍五入一样)。...解决来之前在请求中回调请求产生的回调地狱,使得现在的代码更加合理更加优雅,也更加容易定位查找问题。...3、then方法返回一个新的Promise实例,并接收两个参数onResolved(fulfilled状态的回调);onRejected(rejected状态的回调,该参数可选)4、catch方法返回一个新的...③Promise 与回调对比解决了回调地狱的问题,将异步操作以同步操作的流程表达出来。...3)Promise缺点1、无法取消Promise,一旦新建它就会立即执行,无法中途取消。2、如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。

    1.4K40
    领券