【问题标题】:Promise not returning complete info from function承诺不从函数返回完整信息
【发布时间】:2020-09-01 12:50:20
【问题描述】:

我有一个完成两个等待任务的函数,一个从云中的数据库中获取信息,另一个获取用户位置。该函数应该返回一个包含这两个任务结果的承诺。出于某种原因,the promise will only return the result of the first await (database...), not the second (Geolocation...)。这是一些与问题相关的代码。

async function grabUserData(): Promise<Object> {
  const data = {
    position: {Latitude: 0, Longitude: 0},
    altitude: 0,
    altitudeAccuracy: 0,
    timestamp: Timestamp.now(),
    };
  await database
    .collection('users')
    .doc(userUID)
    .get()
    .then((doc) => {
      if (doc.exists) {
        'does some work here' (which works fine)
      } else {
        console.log('No such document!');
      }
    });
  await Geolocation.getCurrentPosition((position) => {
    data.position.Longitude = position.coords.longitude;
    data.position.Latitude = position.coords.latitude;
    if (position.coords.altitude != null) {
      data.altitude = position.coords.altitude;
    }
    if (position.coords.altitudeAccuracy != null) {
      data.altitudeAccuracy = position.coords.altitudeAccuracy;
    }
  });
  return new Promise(function (resolve) {
    resolve(data);
  });
}

更新:Geolocation.getCurrentPosition 不返回承诺,因此它不应该在它旁边等待。但是,即使删除它,它也不会改变与我遇到的问题相关的任何内容。我实际上把它放在那里是因为我认为通过等待它,它不会被跳过并返回不完整的数据。

【问题讨论】:

  • Geolocation.getCurrentPosition 不返回承诺,你不能 await 它。
  • 好吧,我知道它没有返回一个承诺,但是由于在文档中它说该方法可能需要一段时间,我想如果我不等待它,它会跳过它并返回数据不完整。

标签: typescript react-native promise async-await


【解决方案1】:

您正在以一种令人困惑的方式结合使用 Promises 的两种方式......也许可以尝试这样的事情。异步函数自动返回 Promises。

已更新以包含地理定位承诺理念:

const getPosition = options => {
  return new Promise(function (resolve, reject) {
    Geolocation.getCurrentPosition(resolve, reject, options);
  });
}

async function grabUserData(): Promise<Object> {
  const data = {
    position: {Latitude: 0, Longitude: 0},
    altitude: 0,
    altitudeAccuracy: 0,
    timestamp: Timestamp.now(),
    };

  const doc = await database
    .collection('users')
    .doc(userUID)
    .get();

  if (doc.exists) {
    'does some work here' (which works fine) 
  } else {
     console.log('No such document!');
  }

  const position = await getPosition()

  data.position.Longitude = position.coords.longitude;
  data.position.Latitude = position.coords.latitude;
  if (position.coords.altitude != null) {
    data.altitude = position.coords.altitude;
  }
  if (position.coords.altitudeAccuracy != null) {
    data.altitudeAccuracy = position.coords.altitudeAccuracy;
  }

  return data;
}

【讨论】:

  • 而且看起来@tkausl 也是对的……Geolocation.getCurrentPosition() 无论如何都不会返回 Promise。
  • 是的,我确实注意到它没有返回承诺,并解释了为什么我在回复@tkausl 时放了一个承诺,但是我的思维过程存在缺陷。我很困惑,无论我是否为方法分配 var/const,这将如何产生影响。
  • 是的,将 Promise 与回调混合使用会让人感到困惑……也许可以使用这样的方法,这样您的 Geolocation 调用实际上就是一个 Promise:gist.github.com/varmais/74586ec1854fe288d393
【解决方案2】:

我假设 Geolocation.getCurrentPosition() 是一个返回 position?

如果是这样,那么您只是缺少then。看起来您将函数传递给getCurrentPosition

await Geolocation.getCurrentPosition()
    .then((position) => { // move the previous function to then
    data.position.Longitude = position.coords.longitude;
    data.position.Latitude = position.coords.latitude;
    if (position.coords.altitude != null) {
      data.altitude = position.coords.altitude;
    }
    if (position.coords.altitudeAccuracy != null) {
      data.altitudeAccuracy = position.coords.altitudeAccuracy;
    }
  });

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2017-04-27
    相关资源
    最近更新 更多