web-dev-qa-db-ja.com

promiseの戻り値を変数に割り当てる方法は?

重複するコメントとして編集引用:[ 非同期呼び出しから応答を返すにはどうすればよいですか?

Promiseは、将来の価値のコンテナです。約束が値を受け取る(解決される)か、取り消される(拒否される)と、この値にアクセスしたいすべての「リスナー」に通知します。

この質問は、promiseに含まれる値を返す方法に関するものです。 returnではなく内の値にアクセスすることはできないことを明確にしたため、答えは私にとって有用でした promise関数。

このテーマに関するその他の役立つ情報源:

元の質問の下:


約束から価値を得る方法と、これら2つの例の違いを理解するのにご協力ください。

//I have a simple ajax call like:

var fetch = function(start_node, end_node) {
var apiEndpoint = 'localhost/nodes/';
var loadurl = apiEndpoint+start_node+'/'+end_node;
return $.ajax({
    url: loadurl,
    type: 'GET',
    dataType: 'json',
    jsonpCallback: 'json'

  });

};
// Then I processed results in something like:
    var getResult = function(data) {
      // do smtg with data
      var result = {'myobject' : result_from_data}
      return result
    }

そして最後に、結果を割り当てたいと思います。

以下は機能しますが、結果はその前に宣言されたグローバル変数に割り当てられるため、約束の概念を無駄にしていると思います。

var r;  
fetch('val1','val2')
.then(function(data){
  r = getResult(data);
})

代わりに、以下はpromise関数をresに割り当てます。

var res = fetch('val1','val2')
.done(function(data){
  return getResult(data);
})

約束そのものではなく、結果の'myobject'を変数resに渡す方法を明確にできますか?

私も試しました:

var res = $.when(fetch('val1','val2'))
.done(function(data){
  return getResult(data);
})

しかし、成功しません。

16
user305883

グローバル変数trickを使用するか、use-as-a-a-promiseトリックを使用する必要があります。

var getStuff = $.when(req1,req2).then(function(data1,data2) { return data1.concat(data2); });

//the variable getStuff is now a promise and any .then chained 
//to it will have data1.concat(data2) passed to it as an argument

getStuff
  .then(function(data1Data2) {
    console.log(data1Data2);
  });

//the next time you want to use it, you have to use the same promise-interface with .then
getStuff
  .then(function(data1Data2) {
    console.log(data1Data2);
  });
10
Adam