2015-02-12 60 views
1

我在另一个问题中发布了大部分相同的代码,但我在这里有一个不同的问题 - 我应该如何理解Javascript异步代码?了解Javascript异步调用

function getUserStatus() { 

    var status; 

    function querySuccess(tx, results) { 
     var len = results.rows.length; 
     var row = results.rows.item(0); 
     console.log(row['id']); 
     status = { 
      question: row['id'] 
     }; 
    } 

    function errorCB(err) { 
     console.log(err); 
    } 

    db.transaction(function(tx) { 
     tx.executeSql('SELECT id FROM calculator ORDER by id ASC LIMIT 1', [], querySuccess, errorCB); 
    }); 
    querySuccess(); 
    console.log(status); 
    return status; 
} 

我知道我的代码在变量状态被定义之前正在执行 - 但是如何在状态被定义之前停止处理呢?我不希望这个过程是异步的 - 如果数据库没有提供任何内容,那么我不希望操作继续。

我的印象是我需要调用querySuccess(),但我会传递给它什么参数?

我对Javascript比较新,我以前没有遇到过这个概念,我对它的工作方式以及如何让我的代码执行我想要的方式感到困惑。

+1

它总是同步的。你不需要自己调用'querySuccess',当查询结束时它会自动调用。将'console.log()'调用放入'querySuccess()'中。 – Barmar 2015-02-12 02:43:53

+0

所有依赖查询成功完成的查询都应在'querySuccess()'函数中。你不能从函数中返回'status'。 – Barmar 2015-02-12 02:46:14

回答

1

当我第一次学习异步编程,我发现它更容易通过匿名函数作为回调:

function getUserStatus(returnCallback) { 
    db.transaction(function(tx) { 
     tx.executeSql('SELECT id FROM calculator ORDER by id ASC LIMIT 1', [], 
      function(tx, results) { //querySuccess callback 
       var len = results.rows.length; 
       var row = results.rows.item(0); 
       console.log(row['id']); 
       var status = {question: row['id']}; 
       console.log(status); 
       returnCallback(status); 
      }, 

      function(err) { //error callback 
       console.log(err); 
       returnCallback(err);   
      }); 
    }); 
} 

我重写,并增加了一些东西,你的代码。希望这会有所帮助:)

不幸的是,我现在没有时间详细介绍并解释所有这些是如何工作的。如果其他人想要编辑这个答案来做到这一点,就直接前进。

好运OP,学习使用异步技术是很难在第一,但真的很容易,一旦你可以在其周围包裹你的头:)

+0

Uncaught TypeError:undefined不是函数 – 2015-02-12 04:04:17

+0

我不得不在这段时间内工作很长一段时间,但我终于明白了它,并通过一些额外的阅读获得了正确的回调。谢谢您的帮助。 – 2015-02-14 10:57:57