它们是两个函数,由JavaScript引擎提供,不用自己部署。...值得注意的是,Promise新建后就会立即执行。...执行顺序 接下来我们探究一下它的执行顺序,看以下代码: let promise = new Promise(function(resolve, reject){ console.log(...表明,在Promise新建后会立即执行,所以 首先输出AAA。然后,then方法指定的回调函数将在当前脚本所有同步任务执行完后才会执行,所以 BBB最后输出。...原因则是Promise属于JavaScript引擎内部任务,而setTimeout则是浏览器API,而引擎内部任务优先级高于浏览器API任务,所以有此结果。
这两个函数是,JavaScript引擎自带的,不用自己定义他们。...实例,所以它可以链式调用状态响应函数可以返回新的Promise,或其他值如果返回新的Promise,那么下一级.then()会在新Promise状态改变之后执行,如果返回其他任何值,则会立刻执行下一级....实例,所以会等到里面的.then()执行完,再执行外面的。...也就是传入了一个Promise实例 在这种情况下,doSomething与doSomethingElse的执行时间是几乎一致的,因为doSomethingElse返回的是一个Promise实例,而不是一个函数...当数组中有一个promise返回则返回,其余的不再执行。
简单介绍一下 Promise 以及他的使用、异常处理、同步处理等等… 介绍 我们都知道 JavaScript 是一种同步编程语言,上一行出错就会影响下一行的执行,但是我们需要数据的时候总不能每次都等上一行执行完成...在 Promise 结束时,无论结果是 fulfilled 或者是 rejected,都会执行指定的回调函数。这为在 Promise 是否成功完成后都需要执行的代码提供了一种方式。...它的 reject 回调执行是只要任何一个输入的 Promise 的 reject 回调执行或者输入不合法的 Promise 就会立即抛出错误,并且 reject 的是第一个抛出的错误信息。.../// 当我们需要同步执行多个 Promise 的时候,可以使用 Promise.all() 来"并发请求",减少等待时间。...; z = '未登录'; } return z; } let authTest = test(1, 1); let hasNext = authTest.next(); console.log
所谓Promise,字面上可以理解为“承诺”,就是说A调用B,B返回一个“承诺”给A,然后A就可以在写计划的时候这么写:当B返回结果给我的时候,A执行方案S1,反之如果B因为什么原因没有给到A想要的结果...,那么A执行应急方案S2,这样一来,所有的潜在风险都在A的可控范围之内了。...,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致 then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调...标准的Promise 可参考html5rocks的这篇文章JavaScript Promises,目前高级浏览器如Chrome、Firefox都已经内置了Promise对象,提供更多的操作接口,比如Promise.all...但Promise也只是解决了回调的深层嵌套的问题,真正简化JavaScript异步编程的还是Generator,在Node.js端,建议考虑Generator。
这一部分我们来讲一讲 JavaScript 的执行。 首先我们考虑一下,如果我们是浏览器或者 Node 的开发者,我们该如何使用 JavaScript 引擎。...当拿到一段 JavaScript 代码时,浏览器或者 Node 环境首先要做的就是;传递给 JavaScript 引擎,并且要求它去执行。...然而,执行 JavaScript 并非一锤子买卖,宿主环境当遇到一些事件时,会继续把一段代码传递给 JavaScript 引擎去执行,此外,我们可能还会提供 API 给 JavaScript 引擎,比如...在 ES3 和更早的版本中,JavaScript 本身还没有异步执行代码的能力,这也就意味着,宿主环境传递给 JavaScript 引擎一段代码,引擎就把代码直接顺次执行了,这个任务也就是宿主发起的任务...Promise 的 then 回调是一个异步的执行过程,下面我们就来研究一下 Promise 函数中的执行顺序,我们来看一段代码示例: var r = new Promise(function(resolve
以下是 Promise 浏览器支持的情况: Chrome 58 Edge 14 Firefox 54 Safari 10 Opera 55 构造 Promise 现在我们新建一个 Promise...对象: new Promise(function (resolve, reject) { // 要做的事情... }); 通过新建一个 Promise 对象好像并没有看出它怎样 "更加优雅地书写复杂的异步任务...Promise 的使用 下面我们通过剖析这段 Promise "计时器" 代码来讲述 Promise 的使用: Promise 构造函数只有一个参数,是一个函数,这个函数在构造之后会直接被异步运行,所以我们称之为起始函数...当 Promise 被构造时,起始函数会被异步执行: 实例 new Promise(function (resolve, reject) { console.log("Run"); }); 这段程序会直接输出...catch(function (err) { console.log(err); }).finally(function () { console.log("End"); }); 这段程序执行结果是
then方法返回一个新的Promise实例,为了在Promise状态发生变化时再执行then里的函数,我们使用一个callbacks数组先把传给then的函数暂存起来,等状态改变时再调用 那么,怎么保证后一个...,在这个resolve里会依次调用callbacks里的回调,这样就执行了then里的方法 启后:上一步中,当then里的方法执行完成后,返回一个结果,如果这个结果是个简单的值,就直接调用新Promise...> { //封装前一个Promise成功时执行的函数 let fulfilled = () => { try { const...实例 注册完成后开始执行构造函数中的异步事件,异步完成之后依次调用callbacks数组中提前注册的回调 手写Promise.all 接收一个Promise实例的数组或具有Iterator接口的对象作为参数...该方法的参数是Promise实例数组,然后其then注册的回调方法是数组中的某一个Promise的状态变为fufilled的时候执行。
我们应该明确一点就是resolve和rejected是相悖的,它的状态只能改变一次,在确定执行后也不能通过调用相悖的方法来改变。...setTimeout(console.log,0,p);//Promise {} setTimeout(console.log,11000,p)//Promise {: undefined} 如果执行器中的代码在超时前解决或者拒绝,那么超时回调再尝试拒绝也只能失败。...期约的实例方法 Promise.prototype.then() 在ES6异步结构中,任何对象都有一个then()方法,它接收俩个参数 onResolved和onRejected,这俩个参数是可选的,如果我们传入的话它会在期约分别进入不同状态时执行...('p1')); p2.then(()=> onRejected('p2'),()=>onResolved('p2')); 再次强调一下期约的只能转换为最终状态一次,我们运行了俩次,但它只执行第一次
首先创建一个Promise对象,根据Promise的状态来执行不同的回调函数。...如果原始 Promise 对象的状态为 fulfilled,那么我们就可以直接执行成功回调函数,并将成功状态的值作为参数传递给它。...如果原始 Promise 对象的状态为 rejected,那么我们就可以直接执行失败回调函数,并将失败原因作为参数传递给它。...但是,如果原始 Promise 对象的状态为 pending,那么我们就需要等待原始 Promise 对象的状态发生变化,再执行相应的操作。2. 当then函数传的参数不是函数怎么办?...在调用then函数中,当Promise的状态为pending时候,会把onResolved和onRejected回调放到各自回调函数队列中,等状态改变(即在执行resolve函数/reject函数)时候
code 1 promise中then()会放到异步执行事件循环中,所以先往后执行,然后再执行事件循环队列中的。...,一旦新建它就会立即执行,无法中途取消。.../zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all JavaScript Promises: 9 Questions:https...://danlevy.net/javascript-promises-quiz/ 阮一峰-Promise对象:http://es6.ruanyifeng.com/#docs/promise 选自《Javascript...筑基》系列文章 原文地址:https://github.com/ataola/JavaScript-Tsukuki/blob/master/note/promise-01.md
Promise 类有 .then() .catch() 和 .finally() 三个方法,这三个方法的参数都是一个函数,.then() 可以将参数中的函数添加到当前 Promise 的正常执行序列,....catch() 则是设定 Promise 的异常处理序列,.finally() 是在 Promise 执行的最后一定会执行的序列。....then() 传入的函数会按顺序依次执行,有任何异常都会直接跳到 catch 序列: 实例 new Promise(function (resolve, reject) { console.log...A: then 块默认会向下顺序执行,return 是不能中断的,可以通过 throw 来跳转至 catch 实现中断。 Q: 什么时候适合用 Promise 而不是传统回调函数?...A: 当需要多次顺序执行异步操作的时候,例如,如果想通过异步方法先后检测用户名和密码,需要先异步检测用户名,然后再异步检测密码的情况下就很适合 Promise。
永远都不应该依赖于不同 Promise 间回调的顺序和调度。 # 回调未调用 没有任何东西(甚至 JavaScript 错误)能阻止 Promise 通知它的决议(如果它决议了的话)。...Promise 甚至把 JavaScript 异常也变成了异步行为,进而极大降低了竞态条件出现的可能。 # 是可信任的 Promise 吗 Promise 并没有完全摆脱回调。...任何 Promise 链的最后一步,不管是什么,总是存在着在未被查看的 Promise 中出现未捕获错误的可能性,尽管这种可能性越来越低。...需要一个 finally() 回调注册,这个回调在 Promise 决议后总是会被调用,并且允许你执行任何必要的清理工作。...如果要对每个 Promise 执行的任务本身是同步的,那这些工具就可以工作,就像前面代码中的 forEach() 。
promise介绍 使用: function getMessageData() { var queryUrl = "http://1.1.1.1:1"; var param = {}; return...new Promise((resolve, reject)=>{ request.post(queryUrl, JSON.stringify(param), function(result){...function getMessageData() { var queryUrl = "http://1.1.1.1:1"; var param = {}; return new Promise...console.log(error) reject(error) }) }).then(data => { var param = data; return new Promise
在JavaScript中,一些操作是异步的。这意味着当这些操作完成时,它们产出的结果或者值并不会立即生效。 Promise是一个特殊的JavaScript对象,它代表了异步操作的最终结果。...resolve() }, 1000) }); promise.then(() => { console.log(1); }); 不出所料,Promise在一秒后被执行,控制台打印"1"。...向下传递数据 当我们需要执行多个异步操作时,我们可能希望将一个异步调用的结果传递给Promise链中的下一个then,这样我们就可以对该数据进行处理。...与catch一样,该方法有助于防止代码重复,并且在执行清理任务时非常有用,例如关闭数据库连接或从UI中移除加载动画。...如果一个Promise被拒绝,它不会停止执行: Promise.allSettled([ new Promise((resolve, reject) => setTimeout(() => resolve
这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象 2.作用 1、主要用于异步计算。...2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果。 3、可以在对象之间传递和操作promise,帮助我们处理队列。...2.Promise.race(iterable) 当iterable参数里的任意一个子promise被成功或失败后,父promise马上也会用子promise的成功返回值或失败详情作为参数调用父promise...如果该值是thenable(即,带有then方法的对象),返回的Promise对象的最终状态由then方法执行决定;否则的话(该value为空,基本类型或者不带then方法的对象),返回的Promise...通常而言,如果你不知道一个值是否是Promise对象,使用Promise.resolve(value) 来返回一个Promise对象,这样就能将该value以Promise对象形式使用。
我们说处理javascript异步最常用的方式就是通过回调函数,对于回调函数我们昨天对此做了介绍 简单快速, 我们一般使用嵌套回调或者链式回调,会产生以下问题 当采用嵌套回调时,会导致层级太多,不利于维护...) 回调函数调用过早 调用过早就是将异步函数作为同步处理了, 我们之前说过,javascript以单线程同步的方式执行主线程,遇到异步会将异步函数放入到任务队列中, 当主线程执行完毕,会循环执行任务队列中的函数...直接手动是promise的状态切为成功状态,console.log("我是异步执行的");这段代码也是异步执行的 提供给then()的回调永远都是异步执行的,所以promise中不会出现回调函数过早执行的情况...回调函数调用过晚或不被调用 回调函数调用过晚 回调函数调用过晚的处理原理和调用过早很类似, 在promise的then()中存放着异步函数,所有的异步都存在于js的任务队列中,当js的主线程执行完毕后...,会依次执行任务队列中的内容,不会出现执行过晚的情况 回调函数不被调用 我们用栗子说话 const promise = new Promise((resolve, reject) => resolve
解释一下 从 pending 变为 fulfilled 这段代码,当执行 new Promise() 时,传入的执行函数就立即执行了,此时其内部有一个异步操作(过 500ms 之后执行),等过了 500ms...之后先执行 console.log('Hi,'); 输出 Hi,,此时 promise 的状态为 pending(进行中),而执行 resolve('Promise!')...; }); 上面代码中,不管 promise 最后的状态,在执行完 then 或 catch 指定的回调函数以后,都会执行 finally 方法指定的回调函数。...在异步执行的流程中,可以把执行代码和处理结果的代码清晰地分离开来。 缺点: 无法取消 Promise,一旦新建它就会立即执行,无法中途取消。...参考资料 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise http://
同步和异步任务 要了解异步线程我们首先应该明白它的用处,因为js的单线程特性,任务的执行顺序都是依次执行,而当我们在工作中遇到网络请求,前后端交互的时候,你的数据不会马上拿到,这需要时间,如果等拿到数据再执行下面的代码...,然后继续执行后面的任务,当完成了执行栈里的同步任务之后,再检测是否有异步任务需要执行,最后执行异步任务。...1.3.4.2 ,我们首先找到同步任务,1 3 是同步任务,然后执行异步任务,异步任务如果按顺序执行则是24 但是答案是4.2那么我们可以知道 promise的执行顺序优先于setTimeout所以由此可知...= new Promise((resolve, reject) => { console.log(1); console.log(2); }); promise.then(()...微任务, 直接执行 new Promise 输出 5, 并将 then 函数的回调函数推入 micro Task 的 event queue 中, micro Task 的 event queue 中记
先执行macro-task,等到函数调用栈清空之后再执行所有在队列之中的micro-task。...等到所有micro-task执行完之后再从macro-task中的一个任务队列开始执行,就这样一直循环。...先执行正常栈中的代码,在执行micro-task,然后是macro-task....也就是set开头的最后执行,promise在set之前,promise方法里的第一个执行方法不入栈,在正常栈里执行 console.log('golb1'); setImmediate(function..., 结果如下: golb1 glob1_promise glob1_nextTick glob1_then timeout1 timeout1_promise timeout1_nextTick timeout1
领取专属 10元无门槛券
手把手带您无忧上云