alibaba / rax

🐰 Rax is a progressive framework for building universal application. https://rax.js.org
Other
7.99k stars 627 forks source link

[Question]支付宝小程序真机storage报错 #2234

Closed waylon-gmail closed 2 years ago

waylon-gmail commented 3 years ago

image

微信小程序模拟器没问题; 微信小程序真机没问题; 支付宝小程序模拟器没问题; 支付宝小程序真机报如上错误。

waylon-gmail commented 3 years ago
import { storage } from '@uni/apis';

const setStorage = (key, value): Promise<boolean> => {
  return new Promise((resolve) => {
    storage.setStorage({
      key: `${key}`,
      data: value,
    }).then((res) => {
      resolve(true);
    }).catch((err) => {
      logger.e(LOG_TAG, 'setStorage', err);
      resolve(false);
    }).finally(() => {
    });
  });
};

const setToken = async (token: API.IRestToken): Promise<boolean> => {
  if (!token || !token.accessToken) {
    return false;
  }
  try {
    const result: boolean = await setStorage(tokenCacheKey, JSON.stringify(token));
    return result;
  } catch (e) {
    logger.e(LOG_TAG, 'setToken', e);  //  报错的位置
    return false;
  }
};
waylon-gmail commented 3 years ago

直接改成原生api可以了。用了个if isMiniApp

const setStorage = (key, value): Promise<boolean> => {
  return new Promise((resolve) => {
    if (isMiniApp) {
      my.setStorage({
        key: `${key}`,
        data: value,
        success: (res) => {
          resolve(true);
        },
        fail: (err) => {
          logger.e(LOG_TAG, 'setStorage', err);
          resolve(false);
        },
      });
    } else {
      storage.setStorage({
        key: `${key}`,
        data: value,
      }).then((res) => {
        resolve(true);
      }).catch((err) => {
        logger.e(LOG_TAG, 'setStorage', err);
        resolve(false);
      }).finally(() => {
      });
    }
  });
};
brightcd commented 2 years ago

这个问题是因为支付宝小程序真机环境的Promise没有实现finally方法,跟setStorage api的使用方法没有关系,猜测是支付宝小程序真机Promise实例与模拟器实现不一致,建议可以使用complete回调解决