2017-01-03 13 views
9

このようなシナリオではどうやって連鎖しますか?その中の約束と約束を結ぶ

apiは、http要求後に約束を返す関数です。二度目に呼ばれAPIを解決するかどうか認証は、API応答の後に約束を返す関数ではありません認証拒否した場合。

私はこれを試しましたが、私はコールバック地獄に戻っているだけでなく、うまくいきません。

function api(query) { 
    return new Promise(function(resolve, reject) { 
    //DO SOME STUFF AND SOMETIMES resolves... 
    }) 
} 

function auth() { 
    return new Promise(function(resolve, reject) { 
    api("/foo").then(function(asset1) { 
     api("/bar").then(function(asset2) { 
      resolve(asset2); 
     }).catch(function() { 
      reject(); 
     }) 
    }).catch(function(error) { 
     reject(); 
    }) 

    }) 
} 
+0

は '/ foo'と'/bar'を同時に呼び出すことができますか '/ bar'は'/foo'の結果に依存しているのでしょうか? 'asset1'は決して使われないようです。 – styfle

答えて

5

私が行っていることを理解している限り、次のコードもasset2で解決されます。それ以外にもapi機能がhttpリクエストを行っていると思いますので、new PromiseというものでコールバックAPIを変換する代わりにrequest-promise libを使用すると恩恵を受けることができます。以下のような何かをするだろう、この発信者と

function api(query) { 
    return new Promise(function(resolve, reject) { 
    //DO SOME STUFF AND SOMETIMES resolves... 
    }) 
} 

function auth() { 
    return api("/foo") 
    .then(() => api("/bar")) 
} 

auth() 
.then(asset2 => ...) 
.catch(err => ...) 
apiを呼び出しの順序が重要でない場合は@styfleコメントで指摘のように、あなたは使用してそれを書くことができ

Promise.all

function auth() { 
    return Promise.all([ 
    api("/foo"), 
    api("/bar") 
    ]) 
} 
4

これはあなたに役立つと思います。

ちょうど観測:thenメソッドは、常に前回の約束の解像度に基づいて約束を返します。前回の約束が解決された場合、解決された値が次の約束に渡されます。それ以外の場合は、エラーをcatchメソッドに送信します。 Promises standardから

function auth() { 
    /* 
    Since `then` already returns a new Promise, 
    you don't need to create a new Promise. 
    */ 
    return api('/foo').then(function (asset1) { 
    return api('/bar') 
    }) 
} 

/* 
    So you can call auth: 
*/ 

auth().then(function (asset2) { 
    console.log('This is my asset2:', asset2) 
}).catch(function (error) { 
    console.error('Error', error) 
}) 
2

xが約束された場合は、[3.4]、その状態を採用:xが保留中である場合、Xが満たさまたは拒否されるまで 、約束は保留中のままにしなければなりません。 xが満たされた場合、同じ値で約束を果たしてください。 xが拒否された場合、同じ理由で約束を拒否します。

次の例のプリント 'finalVal':

let resolveP1 = null; 

let p1 = new Promise(function(resolve, reject) { 
    resolveP1 = resolve; 
}); 

let p2 = new Promise(function(resolve, reject) { 
    resolve(p1); 
}); 

let p3 = p2.then(function(finalVal) { 
    console.log(finalVal); 
}); 

resolveP1('finalVal')