【问题标题】:Which is the proper way to wait for an API call to complete before calling a function这是在调用函数之前等待 API 调用完成的正确方法
【发布时间】:2021-10-15 17:18:45
【问题描述】:

我正在开发一个带有 Firebase 云功能的 React 应用。云函数中有API调用,需要时间才能完成。

这是我的功能:

exports.whatThreeWords = functions.firestore
.document('locations/{locationId}')
.onCreate((doc, context) => {
  const locData = doc.data();
  const locId = context.params.locationId;

  const converted = api.convertToCoordinates('///location.location.location')
  .then(data => console.log(data.coordinates))
  const addr= {
    address : `${converted.coordinates}`, 
    id : locId
  }
  return createAddress(addr)
})

const createAddress = (async addr => {
  const doc = await admin.firestore().collection('addr').add(addr);
  return console.log('created', doc);
})

当我这样做时,createAddress() 函数会在 API 调用完成之前运行。

当我将函数调用放入 API 调用中时,我收到一条错误消息,提示函数返回未定义

  const converted = api.convertToCoordinates('///walnuts.flash.potential')
  .then((data) => {
  const addr= {
    address : `${converted.coordinates}`, 
    id : locId
  }
return createAddress(addr)
})

请帮忙。谢谢

【问题讨论】:

    标签: javascript reactjs firebase google-cloud-functions


    【解决方案1】:

    收到 API 响应后从函数返回。

    
    exports.whatThreeWords = functions.firestore
    .document('locations/{locationId}')
    .onCreate((doc, context) => {
      const locData = doc.data();
      const locId = context.params.locationId;
    
      return api.convertToCoordinates('///location.location.location')
      .then(converted => {
        //console.log(data.coordinates)
          const addr= {
            address : `${converted.coordinates}`, 
            id : locId
          }
          return createAddress(addr)
      })
    })
    

    您也可以使用异步等待语法:

    exports.whatThreeWords = functions.firestore
    .document('locations/{locationId}')
    .onCreate(async (doc, context) => {
      //      ^^^^^
      const locData = doc.data();
      const locId = context.params.locationId;
    
      const converted = await api.convertToCoordinates('///location.location.location')
        //console.log(data.coordinates)
      const addr= {
        address : `${converted.coordinates}`, 
        id : locId
      }
      return createAddress(addr)
    })
    
    const createAddress = async addr => {
      const doc = await admin.firestore().collection('addr').add(addr);
      return console.log('created', doc);
    }
    

    【讨论】:

    • 像魅力一样工作谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多