2016-08-16 4 views
0

ブラウザの指紋を取得するために、fingerprintjs2 JavaScriptライブラリを使用しようとしています。JavaScriptの関数パラメータからの戻り値

次のコードは、[OK]を動作します。しかし、私は例えば、後で使用するために、このブロックの外で変数を設定したい

new Fingerprint2().get(function (result) { 
    var output = result; 
    document.write(output); 
}); 

var output; 

new Fingerprint2().get(function (result) { 
    output = result; 
}); 

document.write(output); 

が、この場合には、私が取得出力:

undefined 

私はこれがスコープに関連していると推測していますので、tで変数を設定する方法はありますか彼は外側のスコープ、またはこの関数呼び出しの中に次のコードをすべて入れる必要がありますか?

ネストされた関数の価値を得ることについて他の質問を読んだことがありますが、この場合は動作しないようです。

+0

"範囲に関連しています" - いいえ、 'document.write(output);を' output = result; 'が実行される前に呼び出すためです。 – Igor

+0

' document.write(output); 'コールバック –

+0

getコールは非同期で実行されるので、 '$ .get()'コールがまだ実行されている間に 'document.write(output)'が呼び出されます。 – theClap

答えて

0

非同期取得が返される前に出力を印刷しているため、これは機能しません。

var output; 

var callbackFunction = function(result) { 
output = result; 
document.write(output); 
//do whatever you want to do with output inside this function or call another function inside this function. 
} 

new Fingerprint2().get(function (result) { 
    // you don't know when this will return because its async so you have to code what to do with the variable after it returns; 
    callbackFunction(result); 
}); 
+0

これは私が与えた最初の例に似ています。 document.writeはうまくいきましたが、出力変数を外側のスコープで利用できるようにしたいのですが、可能であれば他の関数で使用されます。 – finoutlook

+0

これはOPのポストに書かれているものです。 – theClap

+0

できません。コードは非同期なので、それをラップする必要があります。あなたができることは、コールバック関数をアタッチし、非同期ブロックの外でこれまでに何をしたいかを行うことです。 –

0

それはuがそれを行う必要があります方法ではありません。

はこれを試してみてください。 i "のメートルES6を使用してコードをwriteing

let Fingerprint2Obj = new Fingerprint2().get(function (result) { 
    let obj = { 
    output: result 
    } 
    return obj; 
}); 

あなたがオブジェクトまたは文字列を経由して、それを送信instand場合は、関数の外VARを呼び出すことはできません のdocument.write(Fingerprint2Obj.output);。。

+1

ハム私は 'Fingerprint2Obj'がコールバックによって返された値をとるとは思わない –

+0

これは、グローバル変数の非同期呼び出しから返された値をOPの問題として解決できないと呼ばれる。 – theClap