2017-01-03 16 views
9

आप इस तरह के परिदृश्य में कैसे चेन करते हैं?चेनिंग वादे के साथ वादे के साथ वादे करता है()

एपीआई एक ऐसा फ़ंक्शन है जो http अनुरोध के बाद वादा करता है। प्रमाणन, एक समारोह के बाद एपीआई जवाब एक वादा देता है अगर एपीआई दूसरी बार कहा जाता है सुलझती नहीं प्रमाणन अस्वीकार करता है।

मैंने कोशिश की, लेकिन न केवल मैं कॉलबैक नरक में वापस जा रहा हूं, यह काम नहीं करता है।

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' का परिणाम पर भरोसा करते हैं? ऐसा प्रतीत होता है कि 'परिसंपत्ति 1' का कभी भी उपयोग नहीं किया जाता है – styfle

उत्तर

5

जहां तक ​​मैं समझता हूँ तुम क्या करने कोशिश कर रहे हैं, तो निम्न कोड भी asset2 साथ समाधान हो जाएगा। इसके अलावा मुझे लगता है कि api फ़ंक्शन http अनुरोध कर रहा है ताकि आप चीज़ के साथ कॉलबैक एपीआई को परिवर्तित करने के बजाय 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 विधि में भेज देगा।

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
Promises standard से

:

यदि x एक वादा है, अपने राज्य [3.4] अपनाने: यदि 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') 
संबंधित मुद्दे