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

如何在使用onSnapshot回调时让调用firebase.firestore.set的异步React函数等待?

在使用onSnapshot回调时让调用firebase.firestore.set的异步React函数等待,可以采用以下步骤:

  1. 首先,确保你已经正确配置了Firebase和Firestore,并且在你的React组件中正确地引入了相关的依赖。
  2. 在React组件中,你可以创建一个异步函数来处理数据的获取和设置操作。例如,你可以创建一个名为getDataAndSet的异步函数。
  3. getDataAndSet函数中,首先使用onSnapshot方法来监听Firestore文档的变化。onSnapshot方法会返回一个取消监听的函数。
  4. onSnapshot的回调函数中,你可以使用await关键字来等待异步获取到的数据,并进行一些操作。例如,你可以使用await关键字等待获取到的数据并将其存储在一个变量中。
  5. 在获取到数据后,你可以使用firebase.firestore.set方法来更新Firestore中的数据。
  6. 为了让调用firebase.firestore.set的异步函数等待,你可以使用Promise来创建一个新的Promise实例,并在resolve回调中执行firebase.firestore.set方法。
  7. resolve回调中,你可以通过传递获取到的数据来更新Firestore中的文档。
  8. 最后,在你的React组件中,你可以调用getDataAndSet函数,并在需要等待异步操作完成时使用await关键字。

下面是一个示例代码:

代码语言:txt
复制
import React, { useEffect } from 'react';
import firebase from 'firebase/app';
import 'firebase/firestore';

const getDataAndSet = async () => {
  const unsubscribe = firebase.firestore().collection('yourCollection')
    .doc('yourDocument')
    .onSnapshot(async (snapshot) => {
      const data = snapshot.data();
      // 对获取到的数据进行操作

      // 创建一个新的Promise实例,并在resolve回调中执行firebase.firestore.set方法
      await new Promise((resolve) => {
        firebase.firestore().collection('yourCollection')
          .doc('yourDocument')
          .set({ /* 更新的数据 */ })
          .then(() => resolve());
      });

      // 在这里可以执行一些回调函数或其他操作
    });

  // 在组件卸载时取消监听
  useEffect(() => {
    return () => unsubscribe();
  }, []);

  // 在需要等待异步操作完成时调用
  await getDataAndSet();
}

const YourComponent = () => {
  useEffect(() => {
    // 调用getDataAndSet函数
    getDataAndSet();
  }, []);

  return (
    // 组件内容
  );
};

export default YourComponent;

这样,当调用firebase.firestore.set的异步函数被触发时,它会等待onSnapshot的回调函数完成之后再执行。这样可以确保在更新Firestore数据之前,获取到的数据是最新的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

来来来,尝试一下 React 18 !

18 ,如果你还使用 redner 函数作为程序入口,控制台会打印一个错误日志来提醒你使用 createRoot() ,只有使用了这个方法后才能使用 React 18 新功能。...,打印顺序应该是 0、0、0、0 实际上,在 React 18 版本之前,上面代码打印顺序是 0、0、2、3 出现这个问题主要原因就是在 React 事件函数异步状态批处理机制不一样。...在异步外面,能够将所有渲染合并成一次,异步里面,则不会合并,会渲染多次。...实际上,在大部分场景下,我们都需要在调用一个接口或者做了一些其他事情之后,再去函数里更新状态,上面的批处理机制就会显得非常鸡肋。...,在 Suspense 组件中渲染 lazy 组件,可以使用等待加载 lazy 组件做优雅降级(比如渲染一些 loading 效果 )。

1.4K20
  • 息息相关 JS 同步,异步和事件轮询

    使用异步 ( 函数、promise、async/await),可以不用阻塞主线程情况下长时间执行网络请求。 了解异步工作方式之前,咱们先来看看同步是怎么样工作。...这意味着这些函数阻塞了调用堆栈或主线程。因此,在执行上述代码,咱们不能执行任何其他操作,这是不理想。 解决办法是什么? 最简单解决方案是异步,各位使用异步调使代码非阻塞。...(在本例中单击event)发生,当该事件发生函数被放置在等待执行消息队列中。...同样,事件轮询检查调用堆栈是否为空,并在调用堆栈为空并执行将事件推送到堆栈。 延迟函数执行 咱们还可以使用setTimeout来延迟函数执行,直到堆栈清空为止。...ES6 任务队列 我们已经了解了异步调和DOM事件是如何执行,它们使用消息队列存储等待执行所有。 ES6引入了任务队列概念,任务队列是 JS 中 promise 所使用

    9.8K31

    详解 JS 中事件循环、宏微任务、Primise对象、定时器函数,以及其在工作中应用和注意事项

    ,确保尽可能快地响应 常见微任务 Promise.then/catch/finally Promise:当Promise状态改变,会执行相应函数 async/await:使用async函数和...await关键字进行异步操作,await后面的代码会作为微任务执行 process.nextTick:在 Node.js 事件循环的当前阶段完成后、下一个事件循环阶段开始之前,安排一个函数尽快执行...这个执行器函数本身接受两个参数:resolve 和 reject,这两个参数也是函数。 当异步操作成功调用 resolve 函数;当操作失败调用 reject 函数。...Promise 在工作中应用场景 Promise 在处理网络请求、文件操作等异步操作非常有用,它使得代码更加清晰,减少了地狱(callback hell)问题。...简单使用方式:requestAnimationFrame 只需要一个函数作为参数,浏览器会自动计算出最适合调用时间。

    25510

    重学JavaScript Promise API

    它就像操作结果代理。 函数 在拥有JavaScript Promise之前,处理异步操作最优雅方式是使用。当异步操作结果就绪就是一个运行函数。...它通常被称为地狱,甚至有自己网页[1]。 当然,这是一个臆造例子,但它有助于说明问题。在实际场景中,我们可能会进行Ajax调用,用结果更新DOM,然后等待动画完成。...goes here }); 首先,我们使用Promise构造函数实例化一个新Promise对象,并传递给它一个函数。...接收两个参数:resolve和reject,它们都是函数。我们所有的异步代码都在函数中。 如果一切运行成功,则通过调用 resolve 来实现Promise。...这些将在Promise解决(即fulfilled或rejected)时调用。如果Promise实现,成功使用我们传递给resolve实际数据触发。

    15020

    React常见面试题

    【hook执行位置】不要在循环、条件 、嵌套中有hook,必须始终在react函数顶层使用Hook,这是因为react需要利用调用顺序来正确更新相应状态,以及调用相应钩子函数,否则会导致调用顺序不一致性...函数变量是保存在运行时作用域里面,当我们有异步操作时候,经常会碰到异步变量引用是之前,也就是旧(这里也可以理解成闭包场景可能引用到旧state、props值),希望输出最新内容的话,可以使用...一、如何在组件加载发起异步任务 二、如何在组件交互发起异步任务 三、其他陷阱 参考资料: React Hooks 异步操作踩坑记 (opens new window) # react hooks...操作 【执行函数】setState第二个参数 # setState到底是同步还是异步?...【取出合成事件】从事件池中取出,为空,则创建 【取出函数】根据元素nodeid(唯一标识key) 和事件类型 从listenerBink 中取出 函数 【返回合成事件】返回带有合成事件参数函数

    4.1K20

    React生命周期

    这个优化可以使用九牛一毛形容(为了这么一点间而一直不跟进技术发展,得不偿失),并且render函数是肯定比异步数据到达先执行,白屏时间并不能减少 关于第一点,如果你想在服务端渲染先完成数据展示再一次性给用户...另外一个原因则是,React想约束使用者,好框架能够人不得已写出容易维护和扩展代码,这一点又是从何谈起,我们可以从新增加以及即将废弃生命周期分析入手 componentWillMount()...首先这个函数功能完全可以使用componentDidMount和constructor来代替,异步获取数据情况上面已经说明了,而如果抛去异步获取数据,其余即是初始化而已,这些功能都可以在constructor...componentWillUpdate() 与 componentWillReceiveProps 类似,许多开发者也会在 componentWillUpdate 中根据 props 变化去触发一些...但不论是 componentWillReceiveProps 还是 componentWillUpdate,都有可能在一次更新中被调用多次,也就是说写在这里函数也有可能会被调用多次,这显然是不可取

    1.8K60

    JS循环中使用async、await正确姿势

    使用await,希望JavaScript暂停执行,直到等待 promise 返回处理结果。...上述结果意味着for循环中有异步代码,是可以等到for循环中异步代码完全跑完之后再执行for循环后面的代码。 但是他不能处理循环,forEach、map、filter等,下面具体分析。...map 中使用 在map中使用await, map 返回值始是promise数组,这是因为异步函数总是返回promise。...' 'End' 实际结果 在forEach循环等待异步结果返回之前就执行了console.log('end') 'Start' 'End' 'js' 'vue' 'node' 'react'...' ] end 实际结果: [ 'js', 'vue', 'node', 'react' ] end 结论:因为异步函数getSkillPromise返回结果返回promise总是真的,所以所有选项都通过了过滤

    3.8K40

    React 中必会 10 个概念

    在深入探讨如何在 React使用它们之前,让我们看看如何使用箭头函数。有多种方式可用于编写箭头函数。我们将在这里介绍一些常见内容,以帮助您入门。 ?...介绍了基本语法,让我们了解如何将箭头函数React 一起使用。除了如上所述定义 React 组件之外,箭头函数在操作数组以及使用异步调和 Promise 也非常有用。...async / await 您可能熟悉异步编程概念。在 JavaScript 中,它们是使用异步代码许多方法(,Promise,诸如 bluebird 和 deferred.js 等外部库)。...异步用于定义异步函数,该函数返回隐式 Promise 作为其结果。 ? 请注意,使用异步函数代码语法和结构看起来像常规同步函数。 关键字 await仅在异步函数中起作用。...我将 async / await 包含在此列表中是因为在每个前端项目中,我们正在做很多需要异步代码工作。一个常见例子是当我们想通过 API 调用获取数据

    6.6K30

    前端经典面试题合集

    ,而是会将这个事件挂起,继续执行执行栈中其他任务当同步事件执行完毕后,再将异步事件对应加入到与当前执行栈中不同另一个任务队列中等待执行任务队列可以分为宏任务对列和微任务对列,当当前执行栈中事件执行完毕后...I/O callbacks 阶段 :这个阶段主要执行系统级别的函数,比如 TCP 连接失败。idle,prepare 阶段 :仅系统内部使用,你只需要知道有这 2 个阶段就可以。...因此这也验证了这句话,先执行函数,再执行 setImmediateclose callbacks 阶段 :执行一些关闭函数 socket.on('close', ...)除了把 Eventloop...将异步任务插入到微任务队列或者宏任务队列中。执行微任务或者宏任务函数。在主线程处理函数同时,也需要判断是否插入微任务和宏任务。...异步指的是当一个进程在执行某个请求,如果这个请求需要等待一段时间才能返回,这个时候进程会继续往下执行,不会阻塞等待消息返回,当消息返回系统再通知进程进行处理。

    88520

    深入理解 React setState

    一、为什么使用 setState React 修改 state 方法有两种: 1、构造函数里修改 state ,只需要直接操作 this.state 即可, 如果在构造函数里执行了异步操作,就需要调用...3、什么情况下同步 在函数、setTimeout 或原生 dom 事件中,setState 是同步; ① 通过函数方法 setState 第二个参数提供函数供开发者使用,在函数中,我们可以实时获取到更新之后数据...三、调用 setState 发生了什么 setState 设置 state 数据流程图: ?...每当 React 调用 batchedUpdate 去执行更新动作,会先把这个锁给“锁上”(置为 true),表明“现在正处于批量更新过程中”。...setState 并不是单纯同步 / 异步,它表现会因调用场景不同而不同:在 React 钩子函数及合成事件中,它表现为异步;而在 setTimeout、setInterval 和原生 dom 事件等情况下

    98950

    JavaScript 如何用回实现异步操作

    函数定义与使用在 JavaScript 中,函数是一种通过函数参数传递函数,这个函数将在某个操作完成或某个事件触发调用函数设计模式使得异步操作变得更加灵活和强大。...这种模式下,函数作用就是在异步操作完成处理结果。2. 事件监听在前端开发中,事件监听器是另一个常见异步函数使用场景。...函数替代方案:Promise 和 async/await1. 使用 PromisePromise 是一种更现代处理异步操作方式,它通过链式调用来解决地狱问题。...在任务完成后,函数调用并传递结果。这样可以代码更加模块化,并提高代码可复用性。...尽管函数有其局限性,特别是在处理复杂异步操作容易导致地狱,但通过合理设计和使用现代异步处理方式 Promise 和 async/await,我们可以有效地避免这些问题并编写出简洁、可维护异步代码

    14910

    React源码笔记】setState原理解析

    异步可以避免react改变状态,资源开销太大,要去等待同步代码执行完毕,使当前JS代码被阻塞,这样带来不好用户体验。 那setState什么时候会执行异步操作或者同步操作呢?...简单来说,由react引发事件处理都是会异步更新state, 合成事件(React自己封装一套事件机制,onClick、onChange等) React生命周期函数使用react不能控制事件则可以实现同步更新..., setTimeout等异步操作 原生事件,addEventListener等 setState调式callback 由上面第一部分代码可知setState方法传入参数是partialState..., callback,partialState是需要修改setState对象,callback是修改之后函数 setState({},()=>{})。...因此也可以得出state批量更新是建立在异步之上,那setTimeout同步更新state就导致state没有批量更新,最后返回2。 那callBack函数咋就能也返回2呢?

    2.1K10

    面试官最喜欢问几个react相关问题

    除了在构造函数中绑定 this,还有其它方式吗你可以使用属性初始值设定项(property initializers)来正确绑定,create-react-app 也是默认支持。...在中你可以使用箭头函数,但问题是每次组件渲染都会创建一个新。...(1)当使用箭头函数作为map等方法函数,箭头函数作用域是当前组件实例化对象(即箭头函数作用域是定义作用域),无须绑定作用域。(2)事件函数要绑定组件作用域。...source参数,默认在每次 render 都会优先调用上次保存中返回函数,后再重新调用;useEffect(() => { // 组件挂载后执行事件绑定 console.log...,可以完成一个轻量级 Redux;(easy-peasy)useCallback: 缓存函数,避免传入每次都是新函数实例而导致依赖组件重新渲染,具有性能优化效果;useMemo: 用于缓存传入

    4K20

    83.精读《React16 新特性》

    在父组件 render 函数中返回对 unstable_createCall 调用,第一个参数是 props.children,第二个参数是一个函数,用于接受子组件响应 Call 所返回信息,第三个参数是...props; 在子组件 render 函数返回对 unstable_createReturn 调用,参数是一个对象,这个对象会在 unstable_createCall 第二个函数参数中访问到;...当父组件下所有子组件都完成渲染周期后,由于子组件返回是对 unstable_createReturn 调用所以并没有渲染元素,unstable_createCall 第二个函数参数会被调用...,这个函数返回是真正渲染子组件元素; 针对普通场景来说,react-call-return 有点过度设计感觉,但是如果针对一些特定场景的话,它作用还是非常明显,比如,在渲染瀑布流布局,利用...yield / async / await,其流程:调用 render 函数 -> 发现有异步请求 -> 暂停渲染,等待异步请求结果 -> 渲染展示数据。

    78140

    React16 新特性

    在父组件 render 函数中返回对 unstable_createCall 调用,第一个参数是 props.children,第二个参数是一个函数,用于接受子组件响应 Call 所返回信息,第三个参数是...props; 在子组件 render 函数返回对 unstable_createReturn 调用,参数是一个对象,这个对象会在 unstable_createCall 第二个函数参数中访问到;...当父组件下所有子组件都完成渲染周期后,由于子组件返回是对 unstable_createReturn 调用所以并没有渲染元素,unstable_createCall 第二个函数参数会被调用...,这个函数返回是真正渲染子组件元素; 针对普通场景来说,react-call-return 有点过度设计感觉,但是如果针对一些特定场景的话,它作用还是非常明显,比如,在渲染瀑布流布局,利用...yield / async / await,其流程:调用 render 函数 -> 发现有异步请求 -> 暂停渲染,等待异步请求结果 -> 渲染展示数据。

    1.2K20

    PHP 异步编程模型与并发处理策略

    在 PHP 中,异步编程主要通过事件驱动和函数来实现。事件驱动:事件驱动是异步编程核心概念。在 PHP 中,可以使用事件循环来监听事件发生,并在事件发生执行相应函数。...事件循环通常使用第三方库来实现, ReactPHP、Amp 等。函数函数异步编程中常用一种机制。当异步操作完成,会调用相应函数来处理结果。...函数可以在异步操作开始注册,也可以在异步操作完成后动态添加。ReactPHPReactPHP 是一个基于事件循环异步应用框架,它允许开发者编写非阻塞代码,从而提高应用响应速度和并发能力。...为了更好地处理异常,可以使用 try-catch 语句来捕获异常,并在异常发生进行相应处理。性能优化在使用异步编程和并发处理,需要注意性能优化。...通过合理地使用异步编程模型和并发处理策略,可以充分利用系统资源,提高系统并发处理能力。同时,在使用异步编程和并发处理,需要注意性能优化和异常处理,以确保程序稳定性和可靠性。

    15410

    今年前端面试太难了,记录一下自己面试题

    除了在构造函数中绑定 this,还有其它方式吗你可以使用属性初始值设定项(property initializers)来正确绑定,create-react-app 也是默认支持。...在中你可以使用箭头函数,但问题是每次组件渲染都会创建一个新。...能暂停当前组件渲染, 当完成某件事以后再继续渲染,解决从react出生到现在都存在异步副作用」问题,而且解决得非优雅,使用是 T异步但是同步写法,这是最好解决异步问题方式提供了一个内置函数...act()也支持异步函数,并且你可以在调用使用 await。使用 进行性能评估。...Refs React 所推荐

    3.7K30
    领券