开发者问题收集

React Native 中可能出现未处理的承诺拒绝(id:0)警告

2018-06-21
12853

我在尝试将数据存储在 React Native 中的 AsyncStorage 中时收到此错误 并且数据也未添加到存储中

Possible Unhandled Promise Rejection (id: 0): Error: com.facebook.react.bridge.ReadableNativeMap cannot be cast to java.lang.String Error: com.facebook.react.bridge.ReadableNativeMap cannot be cast to java.lang.String*

我的代码是这样的

  //Public methods
  static addProduct(id,name,qnty){

    let   product={
        id:id,
        name:name,
        qty:qnty,

      };
      let cartResponse={};
      product.rowId = this.generateHash(hashItem);
        AsyncStorage.getItem('CART').then((data) => {
          //Check if the product already in the cartTotalItem
          if (data !== null && data.length>0) {
              if (this.checkIfExist(product.rowId)) {
                //Update product quantity
                data[product.rowId]['qty'] += product.qty;
              }else{
                //Add add product to the storage
                data[product.rowId] = product;
              }
              //Update storage with new data
              AsyncStorage.setItem("CART", data);
              cartResponse = data;
          }else{
            let cartItem ={};
            cartItem[product.rowId] =product;
              AsyncStorage.setItem("CART", cartItem);
              cartResponse =cartItem;
          }
            return true;
        }).catch(error => {
          console.log("Getting cart data error",error);
          return false;
        });
  }

我试图寻找解决方案,发现了几个链接,其中这个, Possible Unhandled Promise Rejection (id:0) Warning 有点旧,但和我遇到了同样的问题。

我尝试从线程中应用相同的解决方案,但并没有解决问题。

有人可以帮忙吗? 谢谢。

2个回答

该错误是由 setItem 函数引起的。setItem 也返回一个承诺,您的值应该是一个字符串。

示例

AsyncStorage.setItem("CART", JSON.stringify(cartItem));
bennygenel
2018-06-21

承诺链可能会令人困惑。根本问题是内部 Promise 拒绝未链接到外部 Promise。

const test = flag => {
  return Promise.resolve('Happy')
    .then(msg => {
      if (flag === 0) return msg;
      if (flag === 1) return Promise.reject('Kaboom!');
      if (flag === 2) Promise.reject('Crash!');
    })
    .catch(err => {
      return `Error: ${err}`;
    });
};

test(0).then(res => log(res)); //'Happy'
test(1).then(res => log(res)); //'Error: Kaboom!'
test(2).then(res => log(res)); //'undefined' then UnhandledPromiseRejectionWarning

在上面的示例中,(0) 无错误退出,(1) 通过返回内部 Promise 以链式方式拒绝,(2) 无错误退出但随后显示烦人的警告。 因此,原始代码中的问题块应该是:

if (data !== null && data.length>0) {
   if (this.checkIfExist(product.rowId)) {
      //Update product quantity
      data[product.rowId]['qty'] += product.qty;
   } else {
      //Add add product to the storage
      data[product.rowId] = product;
   }
   //Update storage with new data
   cartResponse = data;   
   return AsyncStorage.setItem("CART", data); //chain the promises
} else {
   let cartItem ={};
   cartItem[product.rowId] =product;
   cartResponse =cartItem;   
   return AsyncStorage.setItem("CART", cartItem); //chain the promises
}

通过返回 AsyncStorage.setItem(...) 结果,外部 catch 可以处理错误。

我意识到这是一篇旧帖子,但这个问题过去让我感到困惑。希望这可以为其他人澄清一些事情。

Trevedhek
2019-02-21