2016-10-26 10 views
1

これは本当に簡単だと思いますが、わかりません。グローバル変数を返す関数

getCurrentUser関数の中にcurrentUserIdを設定したいと思います。他の関数の中で呼び出すことができます。

以下は私が現在持っているもので、未定義です。私は何が欠けていますか?

var currentUserId; 

function getCurrentUser() { 
    $.ajax({ 
     type: "GET", 
     url: '/set_user', 
     success: function(result) { 
      currentUserId = result.id; 
      return currentUserId; 
     }, 
     error: function(err) { 
      console.log(err); 
     } 

    }) 
}; 

getCurrentUser(); 
console.log("current user id is " + currentUserId);  
+3

あなたのconsole.logは、Ajaxが終了する前に発生します。 – naortor

+0

@naortorあなたは正確です。私はこれを私のコンソールに見ています。これをどうすれば解決できますか?最終的な目標は、この関数を呼び出すことと、他の関数の変数currentUserIdを使用できることです。 – gwalshington

+1

'async:false'を設定することができます – Isukthar

答えて

2

これは、非同期AJAX呼び出しを行っているので、あなたはconsole.logでそれを印刷する際に値がまだ準備ができていない内部getCurrentUser方法ので起こります。

GET /set_user要求が正常に終了するときに正しく設定され、唯一その場合関数:

success: function(result) { 
     currentUserId = result.id; 
     return currentUserId; 
    } 

が実行され、currentUserIdが設定されます。

$.ajaxが返す値は、jQuery.ajax()のドキュメントに基づき、Promiseです。最初に、呼び出し元に約束を返し(1)、約束が解決して値を印刷するのを待ちます(2)。

var currentUserId; 

function getCurrentUser() { 
    return $.ajax({ // 1. Return the Promise here 
     type: "GET", 
     url: '/set_user', 
     success: function(result) { 
      currentUserId = result.id; 
      return currentUserId; 
     }, 
     error: function(err) { 
      console.log(err); 
     } 

    }) 
}; 

// 2. Then wait the call to succeed before print the value (use the 'done' method) 
getCurrentUser().done(function() { 
    console.log("current user id is " + currentUserId);  
}); 
+1

どうすればこの問題を解決できますか? – gwalshington

+0

私の答えを編集しました。それが役に立てば幸い。 – Andrea

+0

これは解決策だと思います。私はそれを更新し、私は今、エラーが発生しています "未定義のプロパティdone 'を読み取ることができませんそのエラーを介して作業何がその問題についての考えですか?ありがとう! – gwalshington

1

Andreaが説明したように、ajax呼び出しを行うと値はまだ準備されていませんでした。これを回避する

一つの方法は、使用するコールバックです:

function getCurrentUser(callback) { 
 
    $.ajax({ 
 
     type: "GET", 
 
     url: '/set_user', 
 
     success: function(result) { 
 
      var currentUserId = result.id; 
 
      if (callback) 
 
       callback(currentUserId); 
 
     }, 
 
     error: function(err) { 
 
      console.log(err); 
 
     } 
 

 
    }) 
 
}; 
 

 
function displayResult(userId){ 
 
    console.log("current user id is " + userId); 
 
} 
 

 
getCurrentUser(displayResult);

そして、これはまた、世界変数currentUserIdの使用を避けることができます。

関連する問題