更好的阅度体验 前言 API Promise特点 状态跟随 V8中的async await和Promise 实现一个Promise 参考 前言 作为一个前端开发,使用了Promise...刚好最近阅读了V8团队的一篇如何实现更快的async await,借着这个机会整理了Promise的相关理解。...Promise.resolve() --将现有对象转为 Promise 对象 --参数是promise实例, 原封不动的返回 --参数是一个thenable对象 将这个对象转为 Promise 对象...一旦状态被改变,就不会再变,任何时候都能得到这个结果,与事件回调不同,事件回调在事件过去后无法再调用函数。 3. 一个promise一旦resolved,再次resolve/reject将失效。...// true 因为直接返回了p,所以省去了中间两个microtask任务,并且输出的顺序也变得正常,也就是V8所说的更快的async await 实现一个Promise 先实现一个基础的函数 function
目录 什么是aysnc和await 为什么要用async aysnc函数解决了什么 async 函数的优点 怎么使用async函数 async函数语法 await语法 错误处理 async+await...为什么要用async 为了使我们的异步代码,更像同步的代码 aysnc函数解决了什么 在async/await之前,我们有三种方式写异步代码 嵌套回调 以Promise为主的链式回调 使用...怎么使用async函数 async函数语法 自动将常规函数转换成Promise,返回值也是一个Promise对象 只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数 异步函数内部可以使用...对象3; } // 相当于让异步函数对象1先执行完毕之后,再执行异步函数对象2,再执行异步函数对象3 注意事项 如果await后面只写一个基本数据类型,会这个基本数据类型进行包装,包装成一个 Promise...对象 async function func() { let data1 = await 123; //1. await后面只写一个基本数据类型 会这个基本数据类型进行包装,包装成一个
由于getNumFruit返回一个promise,我们使用 await 来等待结果的返回并打印它。...(注意回调函数中的async关键字。我们需要这个async关键字,因为await在回调函数中)。...在 map 中使用 await 如果在map中使用await, map 始终返回promise数组,这是因为异步函数总是返回promise。...为什么会发生这种情况? 当在filter 回调中使用await时,回调总是一个promise。由于promise 总是真的,数组中的所有项都通过filter 。...在第二次遍历中,sum是一个promise。 (为什么?因为异步函数总是返回promises!)
})(); await后面可以跟Promise对象或者async函数执行 额外提示:立即执行函数前面有个!...就是这个原因, 5.async/await和Promise的关系 1.执行async函数,返回的是Promise对象 2.await相当于Promise的then 3.try...catch可捕获异常...data); }) 可以看到res1却是是一个Promise对象 我们把async函数的返回改一下,直接返回一个Promise对象试试 async function fn1() { return...async function的函数 返回结果都是 Promise 对象(如果函数内没返回 Promise ,则自动封装一下) async+表达式 await 后面跟 Promise 对象:会阻断后续代码...chrome/73+后的版本,如果await一个常量或者async函数或者普通函数,都会把后面紧接着的代码正常添加到微任务队列。
在调用一个Generator函数后,并不会立即执行其中的代码,函数会返回一个Generator对象,通过调用对象的next函数,可以获得yield/return的返回值。...main()函数这个Generator,并处理其中生成的Promise,然后在then回调中将结果返回到Generator函数,以便可以执行下边的代码。...(因为你还要去解释那些类似co的库) async/await是处理Promise的一个极其方便的方法,但如果使用不当的话,也会造成一些令人头疼的问题 Async函数始终返回一个Promise 一个...,在我们使用map创建这个数组时,所有的Promise代码都会执行,也就是说,所有的请求都会同时发出去,然后我们通过await Promise.all来监听所有Promise的响应。...始终返回一个Promise,使用await或者.then()来获取返回值 Generator是属于生成器,一种特殊的迭代器,用来解决异步回调问题感觉有些不务正业了。。
因为async并不会判断你后边的是不是一个数组(这个是在co中有额外的处理)而仅仅检查表达式是否为一个Promise实例。...: if (isAdmin(1)) { // 管理员的操作 } else { // 普通用户的操作 } 因为async函数的调用会返回一个Promise实例,得益于我强大的弱类型脚本语言,Promise...eslint、ts 之类的都很难解决这个问题 一些建议 何时应该用 async ,何时应该直接用 Promise 首先,async函数的执行返回值就是一个Promise,所以可以简单地理解为async...合理的减少 await 关键字 await只能在async函数中使用,await后边可以跟一个Promise实例,这个是大家都知道的。 但是同样的,有些await其实并没有存在的必要。...结合着前边提到的在async函数中返回数据是一个类似Promise.resolve/Promise.reject的过程。 而await就是类似监听then的动作。
Yodonicc无论你对async/await的立场如何,我都想向你说明,根据我的经验,为什么async/await往往会使代码复杂度更高,而不是更低。...每当有try/catch时,我们现在不仅要担心函数返回什么,还要担心它抛出什么。我们不仅有分支逻辑,这增加了复杂性,而且还必须担心同时处理两种不同的范式。一个函数可以返回一个值,也可以抛出。...在我讨论这个问题之前,首先让我承认,事实上不可能用async/await创造出金字塔结构的回调地狱,所以它有这个优势。但是我从来没有写过一个超过两级的promise流,没有必要。...每次你想在你的承诺流中写一个then或catch,首先确保你返回promise,然后转到最外层的promise(如果你一直遵循这个规则,那应该只有一层)并在那里添加你的then或catch。...一旦你在一个promise的上下文中,任何返回的值都会通过它冒泡。Promise、number、字符串、函数、对象,等等。
、Await都是一种异步解决方案Promise是一个构造函数,调用的时候会生成Promise实例。...async/await成对出现,async标记的函数会返回一个Promise对象,可以使用then方法添加回调函数。await后面的语句会同步执行。...对象时直接返回这个 Promise 对象,then 函数在这个 Promise 对象发生改变后立刻执行。...为什么'resolvePromise resolved'会在第三行才显示呢?和舍友讨论了一晚上无果。其实这个题目的难点就在于resolve一个Promise对象,js引擎会怎么处理。...我们知道Promise.resolve()的参数为Promise对象时,会直接返回这个Promise对象。
、Await都是一种异步解决方案Promise是一个构造函数,调用的时候会生成Promise实例。...async/await成对出现,async标记的函数会返回一个Promise对象,可以使用then方法添加回调函数。await后面的语句会同步执行。...的参数为 promise 对象时直接返回这个 Promise 对象,then 函数在这个 Promise 对象发生改变后立刻执行。...为什么'resolvePromise resolved'会在第三行才显示呢?和舍友讨论了一晚上无果。其实这个题目的难点就在于resolve一个Promise对象,js引擎会怎么处理。...我们知道Promise.resolve()的参数为Promise对象时,会直接返回这个Promise对象。
async方法内做好try catch,不要把报错抛到框架层; 2、async方法,实际返回了一个promise,默认把return值作为promise的resolve内容,而报错则封装为promise...的reject; 3、async方法内那么遇到异常要终止,可以直接throw ‘xxx’/Error; 4、async方法内如果有调用下一层方法(这个方法是async方法或返回Promise),则需要加...await,等待这个promise结果;如果同时要返回该下层调用的return值,则可以省略await,改为直接return这个Promise(但不建议,还是统一await同步写法比较好理解,详见下文例子...为什么async方法一定要加await或catch? 这里,需要先看一个例子,大家看看有什么问题。...为什么async方法内不要return Promise?
async 是一个修饰符,async 定义的函数会默认的返回一个Promise对象resolve的值,因此对async函数可以直接进行then操作,返回的值即为then方法的传入函数。...await 也是一个修饰符,await 关键字 只能放在 async 函数内部, await关键字的作用 就是获取 Promise中返回的内容, 获取的是Promise函数中resolve或者reject...这个async声明的异步函数把return后面直接量通过Promise.resolve()返回Promise对象,所以如果这个最外层没有用await调用的话,是可以用原来then链的方式来调用的: async...特点——异步无等待,所以当没有await语句执行async函数,它就会立即执行,返回一个Promise对象,非阻塞,与普通的Promise对象函数一致。...3. async和await简单应用 上面已经说明了 async 会将其后的函数(函数表达式或 Lambda)的返回值封装成一个 Promise 对象,而 await 会等待这个 Promise 完成,
async与Promise的关系 async函数相当于一个简写的返回Promise实例的函数,效果如下: function getNumber () { return new Promise((resolve...在async/await支持度还不是很高的时候,大家都会选择使用generator/yield结合着一些类似于co的库来实现类似的效果 async函数代码执行是同步的,结果返回是异步的 async函数总是会返回一个...但实际上,我们会直接获得返回值:1,也就是说,如果在Promise中返回一个Promise,实际上程序会帮我们执行这个Promise,并在内部的Promise状态改变时触发then之类的回调。...如果忘记添加await关键字,代码层面并不会报错,但是我们接收到的返回值却是一个Promise let number = getNumber() console.log(number) // Promise...为什么在使用Generator+co时没有这个问题 在使用koa1.x的时候,我们直接写yield [].map是不会出现上述所说的串行问题的 看过co源码的小伙伴应该都明白,里边有这么两个函数(删除了其余不相关的代码
) // 对数组元素进行求平方 // > [Promise, Promise, Promise] 这时候,我们获取到的返回值其实就是一个由Promise函数组成的数组了。...所以为什么上边说map函数为最友好的,因为我们知道,Promise有一个函数为Promise.all 会将一个由Promise组成的数组依次执行,并返回一个Promise对象,该对象的结果为数组产生的结果集...Promise {: "[object Promise]3"} 这个结果返回的就会很诡异了,我们在回看上边的reduce的函数签名 对每一项元素执行的回调函数,返回值将被累加到下次函数调用中...9 await会忽略非Promise值,await 0、await undefined与普通代码无异 filter filter作为一个筛选数组用的函数,同样具有遍历的功能: 函数签名同forEach,...2, 3].some(async item => item === 2) // > true 这个函数依然会返回true,但是却不是我们想要的,因为这个是async返回的Promise对象被认定为true
我觉得这道题的关键,不仅是说出正确的打印顺序,更重要的能否说清楚每一个步骤,为什么这样执行。...一句话概括: 带 async 关键字的函数,它使得你的函数的返回值必定是 promise 对象。...也就是,如果async关键字函数返回的不是promise,会自动用 Promise.resolve() 包装。如果async关键字函数显式地返回promise,那就以你返回的promise为准。...Promise 被传递给一个 await 操作符,await 将等待 Promise 正常处理完成并返回其处理结果。...在我们这个例子中,就是 Promise.resolve(undefined) 正常处理完成,并返回其处理结果。那么 await async2() 就算是执行结束了。
首先,你需要了解Promise Promise是使用async/await的基础,所以你一定要先了解Promise是做什么的 Promise是帮助解决回调地狱的一个好东西,能够让异步流程变得更清晰。...async与Promise的关系 async函数相当于一个简写的返回Promise实例的函数,效果如下: function getNumber () { return new Promise((resolve...在async/await支持度还不是很高的时候,大家都会选择使用generator/yield结合着一些类似于co的库来实现类似的效果 async函数代码执行是同步的,结果返回是异步的 async函数总是会返回一个...但实际上,我们会直接获得返回值:1,也就是说,如果在Promise中返回一个Promise,实际上程序会帮我们执行这个Promise,并在内部的Promise状态改变时触发then之类的回调。...为什么在使用Generator+co时没有这个问题 在使用koa1.x的时候,我们直接写yield [].map是不会出现上述所说的串行问题的 看过co源码的小伙伴应该都明白,里边有这么两个函数(删除了其余不相关的代码
领取专属 10元无门槛券
手把手带您无忧上云