我需要使AsyncStorage setItem仅在诺言(然后)完成后运行。
viewShot.current.capture().then(uri => {
page = uri;
//---------------------------------------------------
try {
const dataSave = {
key: '1',
title: 'Page One',
};
pagina.pushScreen.push(dataSave);
await AsyncStorage.setItem('@pages', JSON.stringify(pagina));
// alert('Página Salva!');
} catch (e) {
alert('Erro ao salvar página');
}
//-----------------------------------------------------
});
答案 0 :(得分:0)
看看await
的下划线是如何引起错误的?将鼠标悬停在它上面并读取错误。
您只能在async
不是的uri => { ... }
函数内部等待。
将其标记为异步:
then( async (uri) => { ... } );
更好的是,首先不要使用then
:
// Needs to be inside an `async` function!
const uri = await viewShot.current.capture();
try {
const dataSave = {
// etc
答案 1 :(得分:0)
如果您使用的是async
/ await
语法,则通常根本不使用then
:
const page = await viewShot.current.capture();
try {
const dataSave = {
key: '1',
title: 'Page One',
};
pagina.pushScreen.push(dataSave);
await AsyncStorage.setItem('@pages', JSON.stringify(pagina));
// alert('Página Salva!');
} catch (e) {
alert('Erro ao salvar página');
}
如果,您正在非then
函数中使用async
,并希望继续这样做(而不是使其成为async
,那么您可以使用await
),可以将async
函数传递给then
:
viewShot.current.capture.then(async (page) => {
// −−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^
try {
const dataSave = {
key: '1',
title: 'Page One',
};
pagina.pushScreen.push(dataSave);
await AsyncStorage.setItem('@pages', JSON.stringify(pagina));
// alert('Página Salva!');
} catch (e) {
alert('Erro ao salvar página');
}
});
由于async
函数返回了诺言,并且允许执行处理程序返回诺言,以便将then
中的诺言解析为处理程序中的诺言,这样就可以了。
侧面说明:引用的代码似乎违反了承诺的基本规则之一:它不能处理对原始承诺的拒绝,也不能将承诺从then
返回到其他任何东西可以处理这种拒绝。规则是:处理拒绝,或将promise链返回到可以的东西。