2016-12-18 10 views
0

経験豊富なJSプログラマーにとっては簡単に解決できるこの質問を私に許してください。私はスーパーエージェントを読み込んでフェッチして、REST呼び出しを働かせようとしています。 (私は正しく機能するodataを得ることができましたが、今はRESTが必要です)。しかし、私は約束を混乱させている。私は現在、次のコードを使用して、簡単なrequest.get(またはfetch.get)を作成しようとしている:Superagent&Fetchは約束を返す - これらのハンドリング方法は?

this.ticketList = Request.get(url).then((response) => { 
    return response.body.Tickets; 
}); 
console.log(this.ticketList); // Returns a promise..? 

私は約束に慣れていないんだと、これを処理する方法がわかりません。私が読んだすべてのドキュメントは非同期呼び出しが良いことだと言っていますが、私のアプリケーションは線形であり、続行する前に前の呼び出しのデータが必要です。私は約束を必要としない、私は完全な応答が必要です。 (約束/アヤックスについての私の制限された理解が間違っている場合は、私を修正してください)

私は望む応答オブジェクトを与えるために上記のコードを変更できますか? (JSON優先)また、必要なデータを得るための約束をどうやって処理しますか?

おかげで、あなたはthen文でデータを必要とする、あなたの呼び出しをラップする必要が チャーリー

+0

PS:私は最初にフェッチを試みました、それは私に約束を与えました。私はスーパーエージェント(上記のコード)に変換し、それはまた私に約束を与えます。 –

+0

"私が読んだすべてのドキュメントでは、非同期呼び出しは良いことだと言われていますが、私のアプリケーションは線形で、前の呼び出しからのデータが必要です。 - これはまさに約束が解決するように設計されている問題です。彼らはES7の非同期よりも混乱しています。まあまあうまくいっていることを待っていますが、非同期コードの管理を簡単にするために根本的に設計されています。 – PMV

答えて

1

基本的には、約束では、thenをまとめて処理します。この特定のケースで

Request.get(url) 
     .then((response) => { 
      return response.body.Tickets; 
     }) 
     .then((ticketList) => { 
      console.log(ticketList); 
     }); 

は、実際には2つの then秒にこれを壊すだけではなく、直接response.body.Ticketsでの作業にメリットがありません。通常は、非同期呼び出しを行うために必要な次のポイントまでここですべてを行い、新しい約束を得ます。たとえば、次のように

Request.get(url) 
     .then((response) => { 
      var ticketList = response.body.Tickets; 
      console.log(ticketList); 
      return Request.get(url2); 
     }) 
     .then((response2) => { 
      /* ... */ 
     }); 

基本的に、あなたはすぐにあなたの最初の非同期呼び出し、その呼び出しthen文で提供するコールバックの内部で起こる(またはcatchステートメントに以下のすべてを作るなどの操作の線形セットを持っている場合拒否された約束を処理する)。

+0

ありがとう!これは私を助けた。次回のAPIコールを行う前にユーザーが何かを選択するのを待つ必要があるので、私はあなたの最初の例を使用していました。乾杯! –

1

。残念ながら、ほとんどのHTTP要求は非同期であり、深刻な不具合がなければ何もできません(それは価値がありません)。

あなたの約束の値を別の関数に戻す必要がある場合は、約束自体を返して解決したほうがよいでしょう。あなたが最初の約束に対処する方法を学ぶとき

function shareTickets() { 
    // Get the promise to resolve 
    var getTicketPromise = getTickets(); 

    // Resolve the promise and handle as needed 
    getTicketPromise 
    .then((ticketData) => { 
     console.log('I got the data from the promise: ' + ticketData); 
     doSomethingWithData(ticketData); 
    }) 
    // If an error happens, you can catch it here 
    .catch((error) => console.log(error)); 
} 

// Return the promise itself so it can be resolved in the other function. 
function getTicketPromise() { 

    // Just return the promise 
    return Request.get(url); 
} 

それは痛みのビットだが、彼らは巨大で完済:コードに基づいて

例は、あなたが与えてくれました。しばらくの間、練習を続けていれば、結局それをぶら下げます。

関連する問題