React Native 中可能出现未处理的承诺拒绝(id:0)警告
我在尝试将数据存储在 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 有点旧,但和我遇到了同样的问题。
我尝试从线程中应用相同的解决方案,但并没有解决问题。
有人可以帮忙吗? 谢谢。
该错误是由
setItem
函数引起的。setItem 也返回一个承诺,您的值应该是一个字符串。
示例
AsyncStorage.setItem("CART", JSON.stringify(cartItem));
承诺链可能会令人困惑。根本问题是内部 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 可以处理错误。
我意识到这是一篇旧帖子,但这个问题过去让我感到困惑。希望这可以为其他人澄清一些事情。