代码未按顺序执行

时间:2016-08-04 14:39:11

标签: javascript sql pouchdb cloudant nosql

我的cloudant数据库中有一个_id mittens13的文档。我试图在查询语句中查询它并发出警报,另一个在查询语句之外。

但是,首先调用查询语句之外的那个,它发出undefined的警报,然后它给出了另一个警告hello,它是文档中的项目。我可以知道为什么吗?

Javascript代码

function queryDB() {

    var price;

    db.get("mittens13", function (err, response) {
        console.log(err || response);
        alert(response.title);
        price = response.title;
    });

    alert(price);
}

我的数据库中的文档详情

{
  "_id": "mittens13",
  "_rev": "1-78ef016a3534df0764bbf7178c35ea11",
  "title": "hello",
  "occupation": "kitten123"
}

2 个答案:

答案 0 :(得分:2)

问题:为什么alert(price);会产生undefined

alert(price)显示未定义的原因,即使代码是在db.get代码之后编写的,因为db.get是异步的。

因为它是异步调用,所以程序在继续之前不会等待db.get的响应。因此,在db.get回来之前,您的计划已经到达alert(price);行。它看起来并且看到关于价格的唯一其他代码是var price;。如果您尝试打印,则会导致未定义。

你应该研究ajax和回调。

答案 1 :(得分:1)

db.get是异步的,所以在调用alert(price)之前,函数实际上仍在运行(在不同的线程上)。我认为正确的方法是:

db.get("mittens13", function (err, response) {
    console.log(err || response);
    alert(response.title);
    price = response.title;
}).then(function(){ alert(price) };
.then允许警报(价格)仅在上一个任务完成后运行,它也在同一个线程上运行(我相信,有人可能会纠正我)。还有一个小注意事项,您应该添加一些错误检查,如果发现错误,请务必取消任务继续(.then)