2016-08-04 10 views
1

_idmittens13であるクラウドデータベースにドキュメントがあります。私はそれを照会しようとし、アラートを出してみました.1つはクエリーステートメントで、もう1つはクエリーステートメント外です。コードがシーケンスで実行されない

ただし、クエリステートメントの外側にあるものが最初に呼び出され、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" 
} 
+1

[非同期コールからの応答を返すにはどうすればいいですか?] http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Andreas

答えて

2

質問:なぜalert(price);undefinedを生産していますか? db.getが非同期であるため、

あなたalert(price)はコードがあなたのdb.getコードの後に​​書かれているにもかかわらず、未定義示した理由は、あります。

非同期呼び出しであるため、プログラムは応答を続ける前にdb.getの応答を待機しません。したがって、db.getが戻る前に、あなたのプログラムはすでにalert(price);行に達しています。それは見て、価格について書かれている唯一の他のコードはvar price;であることを確認します。印刷しようとすると、結果は不定になります。

ajaxとコールバックを調べる必要があります。

1

db.getはasyncronousなので、alert(price)を実際にまだ(別のスレッド上で)実行する前に関数と呼びます。私は、正しい方法があることだと思う:.thenが終了して警告(価格が)だけ前のタスクの後に実行することができます

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

、それはまた、同じスレッド上で実行されます(私は信じている、誰かがおそらく私を修正します)。小さなサイドノートでもエラーチェックを追加し、エラーが発生した場合は、タスク継続(.then)をキャンセルしてください。

関連する問題