2017-12-11 9 views
-2

私はES6の約束を新しくし、私がチェーンしたい2つの約束を持っています。私が持っている問題は、最初の約束の結果を2番目の.then()のステートメントに伝えたいということです。ここで私がこれまで持っているものです。ES6約束 - 約束を繋ぎ合わせて議論を連鎖させる正しい方法

export function resolvePage(pageName, contentType) { 
    return contentful.fetchContentByQuery(contentType, { 
     'fields.slug': pageName, 
    }) 
    .then((resOne) => { 
     return contentful.client.getEntries({ 
      'content_type': 'blogArticle' 
     }) 
    }) 
    .then((resTwo) => { 
     console.log(resOne) 
     console.log(resTwo) 

     return Promise.reject(); 
    }); 
} 

私はチェーンの終わりに私は両方の約束の結果にアクセスできるように適切にこれらをチェーンする方法を見つけ出すように見えることはできません。誰かが正しい方向に私を指して、どこが間違っているのか教えてください。私はresOneをパラメータとして2番目のステートメントに渡そうとしましたが、まだ動作しませんでした。

答えて

0

あなたはES6コードを使用しているかどうかに応じて、あなたは非同期/この比較的容易に行うことができますがどちらの約束が処理されます

const {result1, result2} = await Promise.all([promise1, promise2]);

を待っています。両方が解決されると、それぞれの値はresult1result2になります。その後、それらを通常の値として扱うことができます。これは、あなたがコールバックのクリスマスツリーに引数を渡すのを防ぐ;)

+1

なぜdownvote。質問は重複しているかもしれませんが、現在の回答はすべて有効です –

0

前の結果にアクセスする必要がある場合は、内側の約束からチェーンを解除する必要があります。これは余計なレベルのインデントを追加しますが(悲しいことですが)、async/awaitを使用できない場合は、おそらくこれを行う最もクリーンな方法です。スニペットのためにそう

export function resolvePage(pageName, contentType) { 
    return contentful.fetchContentByQuery(contentType, { 
     'fields.slug': pageName, 
    }) 
    .then((resOne) => { 
     return contentful.client.getEntries({ 
      'content_type': 'blogArticle' 
     }).then((resTwo) => { 
      // Note that this is now chaining on the inner promise 
      // So it has access to resOne via the closure. 
      console.log(resOne) 
      console.log(resTwo) 

      return Promise.reject(); 
     }) 
    }); 
} 
関連する問題