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

图解 Promise 实现原理(二)—— Promise 链式调用

本系列文章有如下几个章节组成: 图解 Promise 实现原理(一)—— 基础实现 图解 Promise 实现原理(二)—— Promise 链式调用 图解 Promise 实现原理(三)—— Promise...,只是在 then 方法中 return 了 this,使得 Promise 实例可以多次调用 then 方法,但因为是同一个实例,调用再多次 then 也只能返回相同的一个结果,通常我们希望的链式调用是这样的...引入真正的链式调用,then 返回的一定是一个新的Promise实例。...三、链式调用真正的意义 执行当前 Promise 的 onFulfilled 时,返回值通过调用第二个 Promise 的 resolve 方法,传递给第二个 Promise,作为第二个 Promise...链式调用Promise 难点,更是重点。一定要通过实例还有动画,深刻体会。下一节介绍 Promise 其它原型方法的实现。

1.4K42
您找到你想要的搜索结果了吗?
是的
没有找到

最简实现Promise,支持异步链式调用(20行)

说到Promise,我们首先想到的最核心的功能就是异步链式调用,本篇文章就带你用20行代码实现一个可以异步链式调用Promise。...这个Promise的实现不考虑任何异常情况,只考虑代码最简短,从而便于读者理解核心的异步链式调用原理。 代码 先给代码吧,真就20行。...then 这里是最重要的then实现,链式调用全靠它: Promise.prototype.then = function(onResolved) { // 保存上下文,哪个promise调用的then...promise1, 在then的实现中,我们构造了一个新的promise返回,叫它promise2 在用户调用then方法的时候,用户手动构造了一个promise用来做异步的操作,叫它user...,这就实现了异步的链式调用

93520

最简实现Promise,支持异步链式调用(20行)

说到 Promise,我们首先想到的最核心的功能就是异步链式调用,本篇文章就带你用 20 行代码实现一个可以异步链式调用Promise。...这个 Promise 的实现不考虑任何异常情况,只考虑代码最简短,从而便于读者理解核心的异步链式调用原理。 代码 先给代码吧,真就 20 行。...(fn); 分开来看,fn 就是用户传的函数,这个函数内部调用了 resolve 函数后,就会把 promise 实例上的 cbs 全部执行一遍。...返回的实例叫做promise1 在 Promise.prototype.then 的实现中,我们构造了一个新的 promise 返回,叫它promise2 在用户调用 then 方法的时候...文章总结 本文只是简单实现一个可以异步链式调用promise,而真正的 promise 比它复杂很多很多,涉及到各种异常情况、边界情况的处理。

8810

最简实现Promise,支持异步链式调用(20行)

说到 Promise,我们首先想到的最核心的功能就是异步链式调用,本篇文章就带你用 20 行代码实现一个可以异步链式调用Promise。...这个 Promise 的实现不考虑任何异常情况,只考虑代码最简短,从而便于读者理解核心的异步链式调用原理。 代码 先给代码吧,真就 20 行。...(fn); 复制代码 分开来看,fn 就是用户传的函数,这个函数内部调用了 resolve 函数后,就会把 promise 实例上的 cbs 全部执行一遍。...返回的实例叫做promise1 在 Promise.prototype.then 的实现中,我们构造了一个新的 promise 返回,叫它promise2 在用户调用 then 方法的时候...文章总结 本文只是简单实现一个可以异步链式调用promise,而真正的 promise 比它复杂很多很多,涉及到各种异常情况、边界情况的处理。

74821

聊一聊:一道 Promise 链式调用的题目

调用 then,里面的回调不一定会马上进入队列 如果 then 前面的 promise 已经被 resolve ,那么调用 then 后,回调就会进入队列 如果 then 前面的 promise 还没有被...会把此前和该 promise 挂钩的 then 的回调全部放入队列 明确这几点之后,我们再来逐步分析这段代码: 执行宏任务,实例化 Promise,打印 promise1,之后调用了 resolve,该...而这个 promise 一旦被 resolve,则后面调用 then 的时候,then 的回调可以马上进入队列(严格地说,进入队列的不是回调,而是用于调用回调的某个微任务)。...不瞒各位,我偶尔也会在 StackOverflow 上问一些比较小白的问题,但从不会有人吐槽说 “You are foolish”。...参考链接: 关于promise输出顺序的疑问 深度揭秘 Promise 微任务注册和执行过程 Promise 链式调用顺序引发的思考

50040

vscode源码分析【七】主进程启动消息通信服务

都会获得同样的值(而且这个值是会被缓存起来的); 以后监听消息、发送消息,都根据这个字符串来; 创建服务的代码(serve): export function serve(hook: any): Promise... { return new Promise((c, e) => { const server = createServer(); server.on('error...的对象, c和e是Promise的参数,c代表成功时的回调,e代表失败时的回调(有点类似es6的Promise) 匿名函数内createServer就是nodejs里的原生接口, Server类绑定了连接和断开的事件...this.service.pickFolderAndOpen(arg); case 'pickWorkspaceAndOpen': return this.service.pickWorkspaceAndOpen(arg); case 'showMessageBox...': return this.service.showMessageBox(arg[0], arg[1]); case 'showSaveDialog': return this.service.showSaveDialog

1.3K51

《你不知道的JavaScript》:深入Promise的链式调用

promise的强大在于,promise为链式调用,如果不显式返回一个值,就会隐式返回undefined,并且这个promise仍然会以同样方式链接在一起。...,用来构造一个表示ajax()调用完成的promise function request(url){ return new Promise(function(resolve, reject){...的request(),通过使用第一个url调用它来创建链接中第一步,并且把返回的promise与第一个then()连接起来。...response1一返回,就可以使用这个值构造第二个url,并发出第二个request()调用。第二个request()的promise返回,以便异步流控制中的第三步等待这个ajax调用完成。...如果在链式调用中,有地方报错就执行reject()抛出错误,并由最后的catch()统一捕获。 在实际开发中,可以像这样通过promise构造ajax链式进行异步流调用

73740

一个Electron的设计缺陷及应对方案

preventDefault操作才行,如下代码所示: win.on("close", (e) => { e.preventDefault(); }); 然而这个preventDefault的操作,必须同步调用才能生效...,所有异步调用preventDefault的操作都没有任何效果,代码如下所示: win.on("close", async (e) => { console.log("win close"); await...new Promise((resolve) => setTimeout(resolve, 1000)); e.preventDefault(); //没有任何作用 }); 上述代码中的preventDefault...winCanBeClosedFlag) { e.preventDefault(); let choice = await dialog.showMessageBox(win, {...此时立即调用窗口的close方法,这个窗口的close事件被再次触发,因为winCanBeClosedFlag 变量已经被置为true了,所以不会执行preventDefault操作,窗口被正常关闭。

1.1K53

调用栈到Promise你需要知道的一切

调用该函数时,引擎会将该函数压入调用堆栈中: 全局执行上下文和调用栈 我喜欢将调用栈看作是一叠薯片。如果还没有先吃掉顶部的所有薯片,就吃不到到底部的薯片!...创建和使用 Promise 要创建新的 Promise,可以通过将回调函数传给要调用Promise 构造函数的方法。回调函数可以使用两个参数:resolve 和 reject。...{ 2 // do stuff and resolve 3 // or reject 4}); 在需要时,我们还可以通过调用 Promise.resolve() 来创建和解决 Promise: 1Promise.resolve...; 3}); 4myPromise.catch(err => console.log(err)); 我们也可以调用 Promise.reject() 来创建和 reject Promise: 1Promise.reject...ES6 Promise 和 microtask 队列 如果你还记得前面的章节,JavaScript 中的每个异步回调函数都会在被推入调用栈之前在回调队列中结束。

1.5K30

JavaScript中的Event Loop

首先 创建Promise实例(executor)是同步执行的,Promise.then是异步执行的。 从结果看setTimeout的异步和Promise.then的异步不一样。...平台代码指 引擎,环境,Promise实现代码。实践上来说,这个要求保证了onFulfilled的异步执行(以全新的栈),在then被调用的这个事件循环之后。...每个task定义时都有一个task source,从同一个task source来的task必须放到同一个task queue,从不同源来的则被添加到不同队列。...micro-task包括:process.nextTick, Promises, Object.observe, MutationObserver 事件循环的顺序是从script开始第一次循环,随后全局上下文进入函数调用栈...直到函数调用栈清空只剩全局执行上下文,然后开始执行所有的micro-task。当所有可执行的micro-task执行完毕之后。

27410

electron开发技术知识点笔记

// 如果用户不是在 macOS(darwin) 上运行程序,则调用 app.quit()。// Quit when all windows are closed, except on macOS....function askFruit () { let fruits = ['Apple', 'Orange', 'Grape'] let choice = await dialog.showMessageBox...系统错误弹窗 dialog.showErrorBox(title, content) const answers = ['Yes', 'No', 'Maybe', 'today'] dialog.showMessageBox...clipboard.clear();快捷键// 添加快捷键globalShortcut.register('CommandOrControl+G', () => { dialog.showMessageBox...node程序中需要调用一些其他语言编写的 工具 甚至是dll,需要先编译一下,否则就会有跨平台的问题,例如在windows上运行的软件copy到mac上就不能用了,但是如果源码支持,编译一下,在mac上还是可以用的

1.5K50

如何正确合理使用 JavaScript asyncawait !

在本文中,将从不同的角度探讨 async/await,并演示如何正确有效地使用这对兄弟。...async 函数调用不会造成阻塞,它内部所有的阻塞都被封装在一个 Promise 对象中异步执行。 async/await 的优点 async/await 带给我们的最重要的好处是同步编程风格。...: 在上述代码中,getBooksByAuthorWithPromise 可能返回 promise(正常情况下)或 null 值(异常情况下),在异常情况下,调用者不能调用 .then()。...这意味着 getbooksbyauthorwithwait() 将返回一个 promise,所以也可以使用 .then(...)方式来调用它。 嗯,这未必是件坏事。...在 await 调用时,在调用 await 函数时,如果出现非正常状况就会抛出异常,await 命令后面的 promise 对象,运行结果可能是 rejected,所以最好把await 命令放在 try

3.1K30

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券