在响应本机中可能出现未处理的承诺拒绝(id:0)警告

时间:2018-06-21 09:05:21

标签: javascript reactjs react-native

我在尝试将本机数据存储在AsyncStorage中时遇到此错误,并且数据也未添加到存储中

  

可能未处理的承诺   拒绝(id:0):错误:com.facebook.react.bridge.ReadableNativeMap   无法转换为java.lang.String错误:   com.facebook.react.bridge.ReadableNativeMap无法转换为   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 个答案:

答案 0 :(得分:6)

该错误是由setItem函数引起的。 setItem还会返回一个Promise,您的值应该是一个字符串。

样品

AsyncStorage.setItem("CART", JSON.stringify(cartItem));

答案 1 :(得分:0)

承诺链可能会令人困惑。潜在的问题是内部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(...)结果,外部捕获可以处理错误。

我意识到这是一篇过时的文章,但是这个问题过去使我感到困惑。希望这会为别人澄清一些事情。