首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

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

前言 之前我写过一篇文章,讨论了为什么async await错误可以try catch,而setTimeout等api不能,有小伙伴提出之前面试被面试官问过为什么Promise错误不能try catch...除了返回rejectedthenable,其他值都会被忽略。也就是,如果finally里面产生了异常,或者返回thenable进入rejected状态了,它会改变返回Promise结果。...所以它即使返回了一个新值,最后调用方拿到也是它之前Promise返回值,但是它可以把fulfillment变成rejection,也可以延迟fulfillment(毕竟返回一个thenable的话...上,而后者catch注册在then返回Promnise上,这意味着如果前者里只有p1出错了才会被处理,而后者p1出错,以及then返回Promise出错都能处理。...Promise推出也好多年了,我们日常开发已经离不开它了,即使是async await背地里还是在跟它打交道,希望本文带给大家对Promise更全面的认识,当然了,关于Promise还有一些最佳实践跟反模式

1.3K30

解决前端常见问题:竞态条件

在 React 可以很巧妙通过 useEffect 执行机制来简洁、方便地做到这点: useArticlesLoading.tsx useEffect(() => {  let didCancel...:每次切换获取新文章时,执行 useEffect 返回函数,然后再重新执行 hook,重新渲染。...() 有一个问题,就是其会导致 promise 拒绝,可能会导致未捕获错误: 为了避免,我们可以加个捕获错误处理: useEffect(() => {  const abortController...,在函数也是可以使用: function wait(time: number) { return new Promise((resolve) => { setTimeout(...它需要我们更深入地挖掘并更好地理解 AbortController 是如何工作。对于前端,可以选择自己最合适解决方案。 紧追技术前沿,深挖专业领域 扫码关注我们吧!

1.2K20

实战 React 18 Suspense

在 React 18 ,虽然仍然可以使用useEffect来完成一些事情,如使用 API 接口读取数据填充状态,但实际上不应该将其用于此类目的。...Suspense 如何工作 首先,你需要了解 Promise 工作原理以及它状态。...包装 fetch 逻辑 如上所述,当我们组件正在加载数据或失败时,需要抛出异常,但是一旦成功解决了Promise,就可以简单地返回响应。...状态,然后返回一个名为“read”函数,稍后我们将在组件调用它。...wrapPromise(promise); } export default fetchData; 这只是以接口请求库表现一种抽象,我想强调这只是一种非常简单实现,您可以将上面的所有代码扩展到任何需要做工作

27010

当面试官问你Promise时候,他究竟想听到什么?

Promise解决办法: 1.调用回调过早 对于Promise来说,即使是立即完成Promise也无法同步观察到,也就是一个Promise调用then()时候,即使这个Promise已经决议了...即使代码中出现多次决议,这个Promise也会接受第一次决议,并会忽略掉其他任何后续调用。所以任何通过then()注册回调只会被调用一次。...Promise异步模式有哪些?有什么区别? 好吧,这个问题可能会把面试者问懵……可以考虑另一种问法,或者直接进入下一个问题,说一Promise.all()和Promise.race()区别。...) 可以通过Promise.resolve()方法对不确定值进行Promise化,返回一个Promise对象。...所以即使是一个异步请求,Promise也是可以捕获异常。此外,Promise可以通过catch回调来捕获回调异常。

2.6K50

一个巧妙设计,解锁 React19 初始化接口最佳实践,彻底摒弃 useEffect

此时我们要重新注意 getMessage 执行,返回是一个 promise. const getMessage = async () => { const res = await fetch('https...var promise = getMessage() 由于 getMessage 执行返回依然是一个 promise,因此我们可以将这个 promise 传递给子组件。...// Suspense 包裹子组件 const res = use(api) 只需要这两行代码,就可以非常简单在组件请求接口并初始化页面了。...这个思路核心是利用 useEffect 执行,来记录组件已经完成初始化,然后在函数组件后续执行,就可以阻止 getMessage 执行。...而这种小小巧妙调整,结合我们把 promise 存储在 state 巧思,几乎就可以宣告 useEffect 在异步请求实现可以功成身退了。

12410

React报错之无法在未挂载组件上执行React状态更新

useEffect钩子声明一个isMounted布尔值,用来跟踪组件是否安装。...isMounted 摆脱该警告直截了当方式是,在useEffect钩子中使用isMounted布尔值来跟踪组件是否挂载。 在useEffect,我们初始化isMounted布尔值为true。...当组件卸载时,从useEffect钩子返回函数会被调用。...update state if component is mounted if (isMounted) { setState(result); } } 提取 如果经常这样做,可以将逻辑提取到可重用钩子...该钩子返回一个可变ref对象,其.current属性初始化为传递参数。 我们在useIsMounted钩子中跟踪组件是否挂载,就像我们直接在组件useEffect钩子那样。

2.1K30

比较全面的Promise使用方式

如果函数 createAudioFileAsync() 重写为返回 Promise 形式,那么我们可以像下面这样简单地调用它: const promise = createAudioFileAsync...这和以下同步代码工作原理(执行过程)非常相似。...理想情况下,在忽略这些事件之前,我们应该检查所有拒绝 Promise,来确认这不是代码 bug。...当我们创建新 Promise 但忘记返回它时,会发生这种情况。因此,链条被打破,或者更确切地,我们有两个独立链条竞争(同时在执行两个异步而非一个一个执行)。...这导致在大多数浏览器不能终止 Promise 链里 rejection。 一个好经验法则是总是返回或终止 Promise 链,并且一旦你得到一个新 Promise返回它。

86620

useEffect 怎么支持 async...await

看报错,我们知道 effect function 应该返回一个销毁函数(effect:是指return返回cleanup函数),如果 useEffect 第一个参数传入 async,返回值则变成了 Promise...useEffect 作为 Hooks 中一个很重要 Hooks,可以让你在函数组件执行副作用操作。它能够完成之前 Class Component 生命周期职责。...可以看到上面的 useAsyncEffect,内部 useEffect 返回函数只返回了如下: return () => { // 当前 effect 已经清理 cancelled = true...; }; 这说明,你通过 useAsyncEffect 没有 useEffect 返回函数执行清除副作用功能。...总结与思考 由于 useEffect 是在函数式组件承担执行副作用操作职责,它返回执行操作应该是可以预期,而不能是一个异步函数,所以不支持回调函数 async...await 写法。

1.3K20

useEffect 一定在页面渲染后才会执行吗?

、microTask Promise Callback 以及 macroTask setTimeout Callback 中进行了不同打印。...Demo4: useEffect Callback 渲染后被执行 在上述 Click Event useEffect Callback 即使组件 render 存在长时间 block 逻辑也会被在页面渲染前同步调用...简单翻译过来说也就是: 如果你 Effect 并不是由于交互行为而触发(比如我们前两个 Demo 中表示),React 通常在 useEffect 执行之前将浏览器进行渲染(先执行屏幕渲染,在执行...可以看到文档对于 Effect 执行时机分为了两个不同触发时机,分别: 非交互行为产生 useEffect Callback 执行时机 交互行为下产生 useEffect Callback 执行时机...希望文章内容可以帮助到大家。

16310

JavaScript Promise (期约)

也就是,一个 Promise 决议后,这个 Promise 上所有的通过 then() 注册回调都会在下一个异步时机点上依次立即调用。这些回调任意一个都无法影响或延误对其他回调调用。...(第一个参数)返回值是什么,它都会被自动设置为链接 Promise(第一点完成。...它就会忽略后续任何拒绝和完成 last([]): 只要最后一个 Promise 完成,它就会忽略后续任何拒绝和完成 # 并发迭代 有些时候会需要在一列 Promise 迭代,并对所有 Promise...如果要对每个 Promise 执行任务本身是同步,那这些工具就可以工作,就像前面代码 forEach() 。...分裂值 展开 / 传递参数 # 单决议 Promise 最本质一个特征是:Promise 只能决议一次(完成或拒绝)。在许多异步情况,只会获取一个值一次,所以这可以工作良好。

44030

React报错之Objects are not valid as a React child

JSON.stringify 或者,你可以在JSX代码中使用JSON.stringify()转换该值,以确保它是预期类型。...你必须确保在JSX代码,不会渲染对象或者数组。相反,你必须渲染原始值,比如字符串以及数值。 Date 另一个导致该错误常见原因是,在JSX代码我们试图直接渲染Date对象时。...为了解决该问题,可以只将变量包裹在一组大括号。...async 如果错误依旧存在,请确保在JSX代码没有调用async函数。 async函数返回一个Promise对象,因此在JSX代码,如果调用了async函数,则错误就会发生。...钩子调用async函数可以解决这个错误,因为我们现在渲染是一个数字,而不是Promise对象。

1.1K20

喜马拉雅、ctrip、b站、流利、蜻蜓FM、爱回收前端面试经历

函数返回Promisethen语句中执行,then语句本身也会返回一个Promise然后追加到微任务队列,所以在微任务队列 console.log(3)在 console.log(4)后面,不太清楚同学可以网上查下资料或者关注我公众号...3.3 React Hooks当中useEffect是如何区分生命周期钩子 useEffect可以看成是 componentDidMount, componentDidUpdate和 componentWillUnmount...onClick={()=>{doSomething()}}写法,每次调用 render函数时均会创建一个新函数,即使内容没有发生任何变化,也会导致节点没必要重渲染,建议将函数保存在组件成员对象...请求可以缓存,POST请求不可以缓存; (4) GET请求只能进行url编码,而POST请求支持多种编码方式。...(5) GET请求参数可以保留在浏览器历史,POST请求不会被保留; (6) GET请求长度有限制,发送数据时,GET请求向URL添加数据,URL长度是有限制,最大长度是2048个字符,POST

1.1K20

趁着过年,讲讲 Promise

他们可以填写自己电子邮件地址,这样当歌曲可用时,所有订阅方都能立即收到。即使出了什么大问题,比如工作室着火了,你不能发布这首歌,他们还是会得到通知。...总而言之:执行程序自动运行并尝试执行一项工作。当它完成尝试时,如果成功就调用resolve,如果有错误就调用reject。 新promise构造函数返回promise对象有以下内部属性: ?...: 执行程序自动且立即地(通过new Promise)调用。...总而言之,执行者应该执行一项工作(通常需要花费时间),然后调用resolve或reject来更改相应promise对象状态。 解决或拒绝承诺称为“已解决”,而不是最初“待解决”承诺。...同样,resolve/reject只期望一个参数(或none),并将忽略其他参数。 万一出了问题,遗嘱执行人应该调用reject。这可以用任何类型参数来完成(就像resolve)。

49210
领券