2016-11-28 4 views
0

FB APIを使用してURL(str変数)を取得しようとしています。私はCONSOLE2​​を試したときstr変数の値を取得する方法は?

は、それが写真のURLが含まれていSTR変数の正確な値を示しました。

しかし、私が試したところ、CONSOLE1は動作しませんでした。それは何も印刷しなかった。

いくつかの非同期機能が原因ですか?はい、どのように二つの文を次のコードを書くことができた場合は(私はちょうどに私はgetPhoto()と呼ばれているコンソール1をURLをしたい、1が他の後に実行される問題ではありません)仕事(を1注参照)

注1:両方のステートメントは、strの値がLogin()の機能の中にあることを確認するために、location.hrefとCONSOLE1を意味します。 CONSOLE2ブロックで

function Login() 
    {   
    FB.login(function(response) { 
     if (response.authResponse) 
     { 
      getPhoto(); 
     // window.location.href="quiz.html"; 
      //**CONSOLE1** 
      console.log(str); 
     } else 
     { 
      console.log('User cancelled login or did not fully authorize.'); 
     } 
    },{scope: 'email,user_photos,user_videos,publish_actions'}); 
    } 

    function getPhoto() 
    { 
    FB.api('/me/picture?type=normal', function(response) { 
     var str="<br/><b>Pic</b> : <img src='"+response.data.url+"'/>"; 
     document.getElementById("status").innerHTML+=str; 
     //**CONSOLE2** 
     console.log(str);  
    }); 
    } 
+0

可能な重複http://stackoverflow.com/questions/14220321/how-do-i-return-the-非同期呼び出しからの応答) – CBroe

答えて

0

は、明示的に変数strの定義:

var str=... 

をしかし、コンソール1ブロックで、あなたは実際に変数を定義することはありません。 getPhotoが終了すると、変数strが範囲外になり、もはや存在しなくなります。

これを修正するには、ロジックをFB.apiコールのコールバック関数に入れます。その呼び出しは、独自の関数ではなくFB.loginコールバック関数内に置くことができます。このように:

FB.login(function(response) { 
    if (response.authResponse) { 
    FB.api('/me/picture?type=normal', function(response) { 
... 

JavaScriptでは、コールバックをチェーンまたはネストする必要があります。ログインコールバックを待ってから、次のAPI呼び出しを行い、その後ピクチャコールバックを取得する必要があります。

+0

別の関数の代わりにFB.apiをFB.loginコールバックに入れておくのは良い考えではありません。後で関数を呼び出す場合はどうしたらいいですか? – luschn

+0

あなたが実際にそれをしたい場合は、常にリファクタリングすることができます。問題を尋ねる人がスコープを理解していないときに、物事をより複雑にする点はありません。別の関数から値を返すには、コールバックが必要です。私は彼に最も簡単な答えを与えました。 – fullstackdev

+0

具体的には、他の答えについての彼のコメントを見てください: "私はかなり矢印のことを理解していませんでした。私が与えた答えはJSに対する彼の理解に相応しており、具体的に彼の問題に対処していると感じました。 – fullstackdev

0

str varのスコープはgetPhoto関数内に残ります。 CONSOLE1で値を取得するには、getPhoto関数からstrの戻り値を行う必要があります。

希望すると、これが役立ちます。

1

はどのようにこの件について:

function Login() {  
    FB.login((response) => { 
     if (response.authResponse) { 
      getPhoto((str) => { 
       console.log(str); 
      }); 
     } else { 
      console.log('User cancelled login or did not fully authorize.'); 
     } 
    },{scope: 'email,user_photos,user_videos,publish_actions'}); 
} 

function getPhoto(callback) { 
    FB.api('/me/picture?type=normal', (response) => { 
     const str = '<br/><b>Pic</b> : <img src="' + response.data.url + '"/>'; 
     document.getElementById('status').innerHTML += str; 
     callback(str);  
    }); 
} 

ありすぎて(例えば、約束して)他のソリューションがありますが、コールバック関数を使用することは非常に簡単です。また、ES6の構文(const、arrow functions)も追加しました。

FB.getLoginStatusを使用して、ユーザーがページの読み込みにログインしていることを確認し、その機能のコールバックでgetPhotoを呼び出すこともできます。例えば

http://www.devils-heaven.com/facebook-javascript-sdk-login/

[?私は非同期呼び出しからの応答を返すにはどうすればよい](の
+0

私は矢の事をかなり理解していませんでした。あなたは矢印の事を使わずにそれを働かせてください。 –

+0

ちょうどこれを置き換えてください: "(応答){" ...またはそれ以上、ES6を学ぶ、それは時間です;) – luschn

+0

このコールバックのことをこの例で理解しようとしました:http://stackoverflow.com/questions/40842335/how-do-i-use-callback-to-access-this-variableそれは動作しませんでした。私はこのことを理解することができるので、そこに答えてください。 –

関連する問題