2016-04-24 11 views
0

ライブラリで呼び出している変数の値を変更したいのですが、スコープに問題があると思われます。私のコードは次のようになります:ライブラリ呼び出し内の外部変数値を変更する

var data = ""; 
abc.abc(lat, long).then(function(x) { 
    data = x; 
    console.log(data); 
}); 
console.log(data); 

最初の出力はxの値を示しますが、2番目の出力はまだ空です。私は間違って何をしていますか?

注:abcは、約束を使用する外部ライブラリです。

+0

'.then()'に渡すコールバックは、最後の行の 'console.log()'の後に実行されます。非同期処理の完了後、 .abc() 'が始まりました。それは約束のポイントのようなものです... – nnnnnn

+0

私は約束を使用してはいけませんか?データを変更する方法はありますか? – apr

+0

いいえ、あなたは約束を使用するべきです - そして、それが外部ライブラリがどのように動作するかは実際には選択肢がないかもしれません。しかし、値を使って何をしたいのかは、 '.then()'コールバック(またはそこから呼び出す関数)の中で行われるように、コードを構造化する必要があります。 – nnnnnn

答えて

1

割り当てられる前にdataの値を参照することはできません。内側のfunction(x)と宣言されていても、第2のconsole.logの前にと宣言されていますが、後にと呼ばれるです。

あなたが同期dataにこの方法を参照することができるならば、ない、それぞれの文は、時間= 0

var data = ""; // time = 0 
abc.abc(lat, long).then(function(x) { 
    data = x; // time = N > 2 (i.e. at this time, the promise has been resolved) 
    console.log(data); 
}); // time = 1 
console.log(data); // time = 2 

ボトムラインで始まる、次のコードにラベル付けが実行される時間の簡略図を参照してください。約束をしてください。しかし、潜在的に長時間実行される操作の約束事を使用しないことは推奨されません。

dataへのアクセスは、約束が解決された後にのみ発生するように、コードを採用する必要があります。

そうするためのベストプラクティスは、その約束を覚えて、あなたは非同期プログラミングについても、すべての(もしあれば)

+0

ありがとう私は約束の仕組みがわからなかった。今すぐ入手してください。私のコードを再構築して、これを約束しながら使うようにしましょう。 – apr

1

を使用しているJavaScriptフレームワークに応じて異なる場合がありますが、特定のプロセスが終了した後に、後に実行するので、それはないですIOをユーザーにブロックしている場合は、ロードを使用して、プロセスが実行されていることをユーザーに伝えることができます。

var data = ""; 
//show loading 
//block all input 
abc.abc(lat, long).then(function(x) { 
    data = x; 
    console.log(data); 
    // hide loading 
    // continue the process 
}); 
console.log(data); 
関連する問題