2016-05-07 10 views
1

私は、コードのこの部分を持っている:リターンJson.Stringfy結果

$.getJSON('http://myjsonurl', function(json){console.log(JSON.stringify(json.columns)); }); 

これはコンソールで、私は私のJSONレスポンスから必要なすべてを返します。私の目的は、この値を関数に渡して、別の場所で呼び出せるようにすることです。 (例:

"columns" : getColumns(); 

だから私はこのような機能を作っています:。?

function getColumns() { 
    $.getJSON('http://myjsonurl', function(json){return JSON.stringify(json.columns); }); 
    } 

console.log(getColumns()); // and then call the function in the console log expecting to see the same result as before. 

しかし、私が得るすべては未定義である なぜ

UPDATE:

これはどのようにあります次のコードは、データと列(データテーブルからネイティブにサポートされていないもの)を使用したjsonレスポンスに基づいてデータテーブルを再初期化します。新しいクエリパラメータを使用してテーブルをロードし、ボタンのプラグインが含まれています

var theurl; 
theurl = "http://myjson.json"; 


function updateQueryStringParameternondt(key, value) { 
    var table = $('#datatable-buttons').DataTable(); 
    var ajaxurl = theurl; 
    var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i"); 
    var separator = ajaxurl.indexOf('?') !== -1 ? "&" : "?"; 
    if (ajaxurl.match(re)) { 
    console.log(ajaxurl.replace(re, '$1' + key + "=" + value + '$2')); 
    theurl = ajaxurl.replace(re, '$1' + key + "=" + value + '$2'); 
    table.destroy(); 
    TableManageButtons.init(); 

    } 
    else { 
     console.log(ajaxurl + separator + key + "=" + value); 
    theurl = ajaxurl + separator + key + "=" + value ; 
    table.destroy(); 
    TableManageButtons.init(); 
    } 
} 

TableManageButtons.init(); 

var handleDataTableButtons = function() { 


     0 !== $("#datatable-buttons").length && 

    $.ajax({ 
    url:theurl, 
    dataType: 'json', 
    success: function (json) { 

     $("#datatable-buttons").DataTable({ 
     "data" : json.data, 
     "columns": json.columns,  
      dom: "Bfrtip", 
      buttons: [{ 
       extend: "copy", 
       className: "btn-sm" 
      }, { 
       extend: "csv", 
       className: "btn-sm" 
      }, { 
       extend: "excel", 
       className: "btn-sm" 
      }, { 
       extend: "pdf", 
       className: "btn-sm" 
      }, { 
       extend: "print", 
       className: "btn-sm" 
      }], 
      responsive: !0 
     }); 
     } 
}); 
    }, 
    TableManageButtons = function() { 
     "use strict"; 
     return { 
      init: function() { 
       handleDataTableButtons(); 
      } 
     }; 
    }(); 
+0

関数のgetColumns(){ リターン$ .getJSON( 'HTTPのレスポンスを解決したい場合にのみ、約束を返すことができることを見ることができます:// myjsonurl '、function(json){JSON.stringify(json.columns);})を返します。 } –

+0

@Ioannis Kokkinis $ .getJSONメソッドからのプロミスだけでなくハンドラの応答も返す必要があります。私は自分自身を説明するためにplunkを提供します。 – gdyrrahitis

+1

'getColumns(" $ datetime-buttons ")。DataTable().Ajax.url")。常に(関数(レスポンス){thecolumns =レスポンス;}); '行は非同期に実行されるので、 'thecolumns'変数は設定されません。非同期とは、JavaScriptが終了するまですべてのコードを実行し、非同期の「マーク済み」コードを実行して、大まかに説明することを意味します。だから、あなたのすべてのデータテーブルのインスタンス化ロジックをコールバックに入れてみてください。 – gdyrrahitis

答えて

2

guest271314 @非同期関数から返された値にアクセスするために.then()を使用しています。

ここで重要なことを指摘したいだけです。

最初に私が作成したplunkを調べます。あなたが見ることができるように、ここでのすべてのジュースはDeferredオブジェクトを操作することです(詳細はhereを参照してください)。 Deferredオブジェクトはコールバックを登録することができ、複数のものが好きな場合はそれらをチェーン化し、呼び出すことで状態と応答をブロードキャストできます。それは設計を約束することに基づいているので、そのようなメソッドは、解決できる、同期または非同期の(約束の約束は非同期操作で有用である)約束を返す。

$.ajaxのようなjQueryの非同期メソッドは、約束を返します。 $.getJSONも同じで、最後に$.ajaxを呼び出します。これは前述のようにjQuery Deferred Promiseを返します。

jQueryのanimationメソッドについては、下記の@ guest271314コメントを参照してください。

約束の詳細here。ドキュメントから

戻るコレクションにバインドされた特定のタイプのすべてのアクションは、キューに入れられたりないとき観察するプロミスオブジェクトは、終了しました。

promise、取り扱う場合のいずれかであるを解決またはを拒否。 は成功応答を表します。rejectは失敗を表します。 ドキュメントから、成功、失敗、またはその両方を処理するオブジェクトがDeferredのメソッドであることがわかります。

deferred.done()繰延オブジェクトが が解決されたときに呼び出されるハンドラを追加します。

deferred.fail() Deferredオブジェクトが拒否されたときに呼び出されるハンドラを追加します。

deferred.always() Deferredオブジェクトが解決または拒否されたときに呼び出されるハンドラを追加します。

だから、OPの質問に戻りましょう。あなたがコードから今すぐ見ることができるように:あなたはpromiseを返さないので

function getColumns() { 
    $.getJSON('http://myjsonurl', function(json){return JSON.stringify(json.columns); }); 
} 

は、あなたがgetColumns状態を知る方法はありません。 $.getJSONハンドラを使用している場合は、約束オブジェクトを放出することなく、本質的に応答を処理します。 getColumnsの機能はもちろんundefinedを返します。なぜなら、returnの兆候がなく、デフォルトでそれを得るからです。

deferred.then()メソッドに関しては、これを使用して、その状態とその進捗状況を処理することもできます。上に掲載したPlunkerのサンプルコードでは、進捗状況は気にしません。最初の例では、約束事は.then()メソッドで処理されます。最初の関数は成功ハンドラであり、2番目の関数フェールハンドラにする。それらからの応答を本質的に返すことは、約束が解決されることを意味する。私は約束自体も返す。コメントアウトセクションで

あなたが好きとalways方法

+0

データ型initilization内にあるとき: "columns":getColumns( "myjson.json ")。)。常に(関数(応答){返信応答;})、 まだ私は応答を取得しません。これはおそらく、データテーブルが値が返される前に初期化しようとしているからでしょうか? –

+0

jQueryデータテーブルの初期化コードも追加して、質問を更新してください。 – gdyrrahitis

+0

私はdatatablesのinitの前に約束の結果を追加する必要があると思いますか? –

1

あなたgetColumns()機能はそれだけではなく、アウト機能に戻されている現時点では、変数を返す必要があります。このお試しください:@MiguelBolanで指摘したように {

function getColumns() { 
    var ret; 
    $.getJSON('http://myjsonurl', function(json){ 
      ret = JSON.stringify(json.columns); 
      }); 
    return ret; 
    } 
+0

console.log(getColumns())を実行してもまだ定義されていません。それはjsonへの呼び出しが来る時間がかかり、追いついていない可能性がありますか? –

+0

printステートメントを 'function(json) 'に移動する方が簡単かもしれませんが、' $ .ajaxSetup({ async:false }); ' {...} 'を返します。 –

+0

これに基づいて:http:// stackoverflow。com/questions/2465446/getjson-each-returns-undefinedこれはおそらく非同期のように見えるでしょう。 –

2

を、何の値がgetColmuns()から返されません。 return$.getJSON()getColumns()から;その答えが正しいか、あなたはgetColumns方法から、undefinedを返しますに関する問題を解決するための指針とすべき

function getColumns() { 
    return $.getJSON("http://myjsonurl"); 
} 

getColumns().then(function(json) { 
    console.log(JSON.stringify(json.columns)) 
} 
// handle errors 
, function err(jqxhr, textStatus, errorThrown) { 
    console.log(textStatus, errorThrown) 
}; 
+0

@IoannisKokkinis注意、 'console.log(getColumns());'は前に呼び出すことができます'$ .getJSON()'はQuestionの 'js'で完了します。また、 'getColumns()'からの戻り値は 'JSON'文字列としての' json.columns'ではなく、jQueryの約束オブジェクトです。 '$ .getJSON()'完全コールバック、またはpostで使われている '.then()';でjQuery約束の値にアクセスできます。 '$ .getJSON()'から 'success'または' error'の結果にアクセスするために '.always()'を使用することができます – guest271314

関連する問題