【问题标题】:Capacitor storage timing issue电容存储时序问题
【发布时间】:2021-10-28 10:25:17
【问题描述】:

我正在尝试在返回常量的函数中获取存储数据。但是,当没有设置存储时,应该使用不同的数据。

我遇到的问题是使用了“其他”数据,因为存储尚未返回信息。

在 .then() 中移动整个函数会导致问题:“声明类型既不是 'void' 也不是 'any' 的函数必须返回 value.ts”。我不知道应该如何解决。

generateMap(id: string, zoom: number): L.Map {
  let current_position = {
    latitude: 52.3702157,
    longitude: 4.8951679
  }

  Storage.get({ key: 'current_position' }).then((result) => {
    if (result.value != null) {
      current_position = JSON.parse(result.value);
    }
  });

  const map = L.map(id,
    {
      zoom: zoom,
      center: latLng({ lat: current_position.latitude, lng: current_position.longitude }),
    });

  return map;
}

【问题讨论】:

    标签: angular ionic-framework local-storage


    【解决方案1】:

    您必须从函数中返回您的 Promise(并随之更改返回类型):

    generateMap(id: string, zoom: number): Promise<L.Map> {
      let current_position = {
        latitude: 52.3702157,
        longitude: 4.8951679
      }
    
      return Storage.get({ key: 'current_position' }).then((result) => {
        if (result.value != null) {
          current_position = JSON.parse(result.value);
        }
    
        return L.map(id,
        {
          zoom: zoom,
          center: latLng({
            lat: current_position.latitude,
            lng: current_position.longitude
          }),
        });
      });
    }
    

    你必须这样称呼它:

    generateMap(id, zoom).then((map) => {
      // here you'll have your map
    });
    

    您也可以使用async/await,但这只是语法糖,因为您的返回类型始终是Promise,但它会增加代码的可读性:

    async generateMap(id: string, zoom: number): Promise<L.Map> {
      const { value } = await Storage.get({ key: 'current_position' });
    
      const currentPosition = value != null
        ? JSON.parse(value)
        : { latitude: 52.3702157, longitude: 4.8951679 };
    
      return L.map(id,{
        zoom: zoom,
        center: latLng({
          lat: currentPosition.latitude,
          lng: currentPosition.longitude
        }),
      });
    }
    

    【讨论】:

    • 我也有同样的想法,但是使用第一种方法时,“声明类型既不是 'void' 也不是 'any' 的函数必须返回 value.ts”的问题仍然存在。因此它不起作用。
    • @S_NoBEl 这只是意味着您忘记在return 前面添加Promise
    • 对不起,我不明白。随着功能从现实中简化,map const 会被进一步处理。你指的是 L.map 上的回报?
    • @S_NoBEl 是的,我是。您无法继续该功能,因为.then 中的任何内容都将在您放在它下方的内容之后执行。 JavaScript 是一种异步事件驱动的语言,执行顺序并不简单。您可以使用async/await 表示法使其更易于理解
    • @S_NoBEl 为了清楚起见,如果您查看代码,.then 内的 if 语句 if (result.value != null) {return map; 之后执行。那是因为您在 .then 调用中传递了一个函数,并且在 Storage.get 解析时调用了该函数,但是原始函数已经返回
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 2015-04-12
    • 2016-03-05
    相关资源
    最近更新 更多