Javascript React Native:同步运行函数
我是新手。我对Promissions/Asynchronous/synchronously running函数的了解很简单。我真的很感谢你的时间和关注 这是React Native docs中的示例: 异步函数getMoviesFromApi(){ 试一试{ let response=等待取数('https://facebook.github.io/react-native/movies.json'); 让responseJson=wait response.json(); 返回responseJson.movies; }捕获(错误){ 控制台错误(error); } }Javascript React Native:同步运行函数,javascript,reactjs,react-native,es6-promise,Javascript,Reactjs,React Native,Es6 Promise,我是新手。我对Promissions/Asynchronous/synchronously running函数的了解很简单。我真的很感谢你的时间和关注 这是React Native docs中的示例: 异步函数getMoviesFromApi(){ 试一试{ let response=等待取数('https://facebook.github.io/react-native/movies.json'); 让responseJson=wait response.json(); 返回respons
getMoviesFromApi
声明为异步函数
。这意味着它将一个接一个地执行函数
否。这只意味着调用时它将返回承诺,并且您可以在函数体中使用wait
运算符
它将首先等待fetch完成,然后调用response.json,对吗
是的,因为它使用wait
停止对方法的评估,直到承诺得到解决
我有几个函数,它们通过fetch从服务器获取数据,然后将数据插入sqlite数据库。所以他们什么也不退
他们应该回报承诺——即使是毫无意义的承诺,他们仍然可以等待
但在你的情况下,他们实际上应该归还一些东西。您的全局静态查询
数组是一个可怕的反模式。每个方法都应该返回(承诺)一个查询,然后可以根据每个实例和每个调用将查询传递给执行者,而不是用查询填充查询。只有这样,使用事务才真正开始有意义
您的代码应该如下所示:
class Main extends Component() {
…
async getBookable(){
var response = await lfetch(host, {
method: 'POST',
headers: …
});
var responseData = await response.json();
return 'INSERT INTO bookable (data) VALUES (' + responseData + ')'); // beware of SQL injections!!!
}
getBooked(){
// the very same - here written without async/await:
return fetch(host, {
// ^^^^^^ important - return a promise
method: 'POST',
headers: …
})
.then(response => response.json())
.then(responseData => {
return 'INSERT INTO booked (data) VALUES (' + responseData + ')';
});
// don't `catch` anything, don't call `done` - just return the promise chain
// errors will be handled in the try/catch below
}
async runQuery(query) {
await db.transaction(tx => {
return Promise.all(query.map(async (q) => {
try {
let results = await tx.executeSql(q, []);
console.log('Query', q, 'Executed. results:', results);
} catch(err) {
console.log('Something went wrong while executing query', q, 'error is', err);
}
}));
});
return true;
}
async function getStore() {
try {
// actually you can fetch these in parallel, right?
let [bookable, booked] = await Promise.all([getBookable(), getBooked()]);
let query = [bookable, booked];
await runQuery(query);
redirectUser();
} catch(error) {
console.error(error);
}
}
}
在您的示例中,
fetch
是什么?您不应该使用有状态的query
数组。相反,让这些方法返回各自要执行的查询。@Bergi从远程服务器获取json数据。我没有在那里编写整个函数,因为我认为这是不必要的。您是否应该将循环放在事务中以确保查询按顺序计算?因此fetch
是异步的?它到底返回了什么?谢谢你的回答。我已经根据你的回答更新了我问题的最后一部分。现在是这样吗?非常感谢!我只是有点头痛,我的浏览器上有30个标签打开,所有的标签都在谈论不同的事情!谢谢你,伙计!我更新了我的全部,有点复杂。我已经更新了我的问题。如果方式正确,请您看一下好吗?@AtaomegagetBookable
似乎不再返回查询(或其数组)getUsers
不应使用Promise.all(query.map(
如果只有一个查询;类似地,在GrabData
中,使用Promise是没有意义的。所有的都在一个元素数组上。而且GrabData
可能不应该调用runQuery
两次-为什么不执行一个事务呢?但是,如果您正在寻找更多的查询,您应该在(假设代码有效)或(否则)。请不要不断更改您的问题。谢谢Bergi。我会这样做的