Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React Native:同步运行函数_Javascript_Reactjs_React Native_Es6 Promise - Fatal编程技术网

Javascript React Native:同步运行函数

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

我是新手。我对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); } }
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个标签打开,所有的标签都在谈论不同的事情!谢谢你,伙计!我更新了我的全部,有点复杂。我已经更新了我的问题。如果方式正确,请您看一下好吗?@Ataomega
getBookable
似乎不再返回查询(或其数组)
getUsers
不应使用
Promise.all(query.map(
如果只有一个查询;类似地,在
GrabData
中,使用
Promise是没有意义的。所有的
都在一个元素数组上。而且
GrabData
可能不应该调用
runQuery
两次-为什么不执行一个事务呢?但是,如果您正在寻找更多的查询,您应该在(假设代码有效)或(否则)。请不要不断更改您的问题。谢谢Bergi。我会这样做的