首页
学习
活动
专区
圈层
工具
发布

NodeJS中的异步编程经验

在 Node.js 6.6.0 中增加了一个特性:对 Promise 中未处理的 rejection 默认会输出 UnhandledPromiseRejectionWarning 提示 例如:test.js...Promise API 中有 .catch() 这个方法,可以用来处理捕捉 rejection 进行处理 但是注意: 这个例子中虽然用 .catch() 捕捉处理了 Promise 中的...rejection;但是注意在 err.message 中的 err 是未定义的,代码执行时会抛出错误,由于没有后续的处理,所以也会输出 UnhandledPromiseRejectionWarning...可以参考文章:ES7 中的 async await,在这篇文章中详细介绍了 Async/Await 并且和 Promise 进行了对比,Async/Await 在处理异步操作上的优势更明显。...的警告 解决问题 最后解决一下文章开头的问题:构建任务中 html 解析错误,出现了一个 Unhandled Rejection,所以我们可以添加一个 unhandledRejection 事件监听,

2.3K20

then, catch, finally如何影响返回的Promise实例状态

我自己也意识到了这一点,于是我通过一些代码试验,发现了一些共性。如果您对这块内容还没有把握,不妨看看。...rejected,并且伴随rejected的reason是刚才抛出的异常的错误对象e。...注意,onFinally不会接受任何参数,因为它从设计上并不关心Promise实例的状态是什么。...如何理解then中抛出异常后会触发随后的catch 由于.then会返回一个新的Promise实例,而在.then回调中抛出了异常,导致这个新Promise的状态变成了rejected,而.catch正是用于处理这个新的...Promise和jQuery的链式调用区别在哪? 上文也提到了,.then, .catch, .finally都产生一个新的Promise实例,所以这种链式调用的对象实例已经发生了变化。

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

    仅仅是 Promise吗?

    众所周知,async await 只是 Promise 的语法糖,但具体是什么语法糖,我自己之前也没细究。...昨天在研究 iOS JavaScriptCore 里边如何捕获未处理的 Promise rejection,发现 jscore 本身并不提供任何接口,只能想其他办法绕过去。...参考了 Egret Native 的实现,发现他们实现和自己的臆想也是吻合的,就是在 JS 侧对 Promise 做覆盖,或者叫 polyfill,这样就能完整的掌控 Promise 实现和 reject...当然,这样做是有缺陷的,只能捕获 Promise,但 async await 方法的报错就无法捕获了,除非 JS 侧把这些都转义为 ES5。...当然,我们自己不会直接写出这样的代码,往往是下游方法,可能某些分支情况下,直接返回了结果,而不是 Promise。

    2K20

    《Promise异常的漏网之鱼:window.onerror失效的底层逻辑》

    在前端监控的精密体系中,存在一处令人困惑的断层:window.onerror能精准捕获同步代码抛出的错误,却对Promise中未处理的异常视而不见。...Promise未处理的rejection则属于“特殊身份”,它们的传递不遵循常规冒泡机制。...规范制定者在引入Promise时,并未修改window.onerror的原有行为,而是为异步错误设计了全新的处理机制,如同为新物种划定独立的生存区域。...如果强行让window.onerror捕获Promise异常,可能导致错误处理逻辑的混乱,如同用温度计测量声音,工具与对象的属性不匹配。...为了填补监控的空白,规范后续引入了unhandledrejection事件,专门用于捕获未处理的Promise异常。

    14900

    Vue项目处理错误上报如此简单

    Promise 链的错误,可以说是非常强大了,但是它也并非能处理所有的异常,否则文章写到这就该结束了 ~ 接下来我们测试一下。...('vue异常错误捕获: ', '错误发生在 ' + info) } 图片 可以看到异常成功被捕获了,因为我们模拟了一个数据错误导致渲染出错,所以错误发生在 render 层,如果是在函数中的 Promise..._handled = true return ret.catch((e) => errorHandler(e, this, `捕获到了未处理的Promise异常: (Promise...', (event) => { console.log('全局捕获未处理的Promise异常', event) }) 图片 完整代码 errorPlugin.js function errorHandler..._handled = true return ret.catch((e) => errorHandler(e, this, `捕获到了未处理的Promise异常: (Promise

    1.9K21

    比较全面的Promise使用方式

    Promise是什么 Promise 是一个对象,它代表了一个异步操作的最终完成或者失败。...对象,从而形成另一个异步操作,这样的话,在 promise2 上新增的回调函数会排在这个 Promise 对象的后面。...2 传递到 then() 中的函数被置入到一个微任务队列中,而不是立即执行,这意味着它是在 JavaScript 事件队列的所有运行时结束了,且事件队列被清空之后,才开始执行: const wait...单独的链也有单独的错误处理,导致未捕获的错误。 第二个错误是不必要地嵌套,实现第一个错误。嵌套还限制了内部错误处理程序的范围,如果是非预期的,可能会导致未捕获的错误。...这导致在大多数浏览器中不能终止的 Promise 链里的 rejection。 一个好的经验法则是总是返回或终止 Promise 链,并且一旦你得到一个新的 Promise,返回它。

    1.3K20

    一文详聊前端异常原理

    RangeError 范围错误,比如: new Array(-20) 会导致 RangeError: Invalid array length 递归等消耗内存的程序会导致 RangeError: Maximum...,普通递归创建 stack 累积而后计算收缩,尾递归只会占用恒量的内存。...当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。 5. Error 与自定义异常 Error 是所有错误的基类,其他错误类型继承该类型。...主要注意的是,Promise 的 catch 方法用于处理 rejected 状态,而非处理异常。Rejected 状态未处理的话会触发 Uncaught Rejection....来捕获接口状态 总结 本文详细讲解了 ECMA 中 8 种异常的产生原理,涉及了 LHS&RHS、递归优化、ScriptError、finally、Promise 等知识点,希望在处理异常的工作中能给你带来帮助

    2.8K40

    怎么理解JS Promise

    这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象 看完这段话我的内心一阵无语,我就只能怪我自己的理解能力好像没有达到水准一样,并不完全懂这段话在说什么...,这让我一度怀疑我这智商是不是不够用了,怎么就没理解这段话说的是什么意思。...,小丽实现了她的承诺 3.rejected(已拒绝/没有实现):小丽忘了小花的生日,所以没有送漂亮衣服给小花 然后我们来了解一下Promise的特点: 1.promise是一个异步操作, 上面不是给了promise...*/ ); 我们继续用上面的例子来解释这Promise对象里面的 resolve 和 reject 是什么。...如果传入的 onFulfilled 参数类型不是函数,则会在内部被替换为(x) => x ,即原样返回 promise 最终结果的函数 onRejected 当Promise变成拒绝状态(rejection

    13.1K30

    面试官:为什么Promise中的错误不能被trycatch?

    本身并没有做什么骚操作,它只是提供了一种观察异步逻辑的途径,而不是让我们的逻辑变成异步,比如在这里我们自己实现异步逻辑时还是要通过调用setTimeout。...这样我们就可以很轻松地把一个thenable转换为一个原生的Promise,而且更加方便的是如果有时候我们不确定我们接收到的对象是不是Promise,用它包裹一下就好了,这样我们拿到的肯定是一个Promise...如果是一个带有thenable方法的对象,就会调用它的thenable方法来resolve给当前Promise。...const p2=p1.catch(error=>doSomethingWith(error)) 这里我们在p1上注册了一个rejection handler,并返回了一个新的Promise p2,p2...如果Promise已经变成fulfilled了,那fulfillment handler会被立即调度(不是立即执行),调度指的是被加入微任务队列,确保这些handler被异步调用大概是Promise唯一让同步代码被异步调用的情形了

    2.2K30

    你没有抓住 Promises 的要点

    这大概是我见过的最简陋的规范了,基本上只是对于这一类函数的行为做了简单说明: promise 是一种以函数来作为 then 属性值的对象: then(fulfilledHandler, errorHandler...这就解释了第一段的关键:函数应当返回一个新的 promise 对象。JQuery(1.8 以前的版本)却不这么做。他们只是继续使用原有的 promise 对象,但是把它的状态改变一下而已。...这就意味着如果你把 promise 对象给客户了,他们其实是可以可以改变它的状态的。...事实上,Promises/A 规范其实已经说明了这一点: 一旦 promise 装载数据完成或者失败了,promise 的值就不可以再改变了,就像 JavaScript 中的数值、原语类型、对象 ID...如果你在某个 handler 里面写一个叫做 aFunctionThatDoesNotExist() 的函数,你的 promise 对象失败以后会抛出异常,接着你的异常向上冒泡,外面最近的一个 rejection

    96010

    Promise机制

    例如,使用Promise API执行异步调用远程服务,但是在发起请求前你并不知道返回的数据对象是什么样子,你可以创建一个Promise对象作为未来某个时间返回的数据对象,在此期间, Promise对象扮演了真实数据的代理角色...如果 then 不是函数,以 x 为参数执行 promise 如果 x 不为对象或者函数,以 x 为参数执行 promise 如果一个 promise 被一个循环的 thenable 链中的对象解决,...) 如果 value 不是一个 promise ,那么下一事件循环 callback 会被调用, value 作为 callback 的传入值。...value 参数如果不是一个 promise ,会被包装成一个 promise 的 ref 。 resolve 方法会忽略之后的所有调用。...Promises/A+ 对.then方法进行细致的补充,定义了细致的Promise Resolution Procedure流程,并且将.then方法作为 promise 的对象甄别方法。

    1.8K100

    Promises机制

    例如,使用Promise API执行异步调用远程服务,但是在发起请求前你并不知道返回的数据对象是什么样子,你可以创建一个Promise对象作为未来某个时间返回的数据对象,在此期间, Promise对象扮演了真实数据的代理角色...如果 then 不是函数,以 x 为参数执行 promise 如果 x 不为对象或者函数,以 x 为参数执行 promise 如果一个 promise 被一个循环的 thenable 链中的对象解决,...value 参数如果不是一个 promise ,会被包装成一个 promise 的 ref 。 resolve 方法会忽略之后的所有调用。...rejection 回调必须接受一个 rejection 原因(可以是任何值)作为第一个参数  get,此时第三个参数为属性名(字符串类型)  put,此时第三个参数为属性名(字符串类型),第四个参数为新属性值...Promises/A+ 对.then方法进行细致的补充,定义了细致的Promise Resolution Procedure流程,并且将.then方法作为 promise 的对象甄别方法。

    1.1K40
    领券