दिलचस्प पोस्ट
एचटीएमएल। टेक्स्टबॉक्सफोर और एचटीएमएल के बीच अंतर एमडीसी और रेजर के लिए एडिटर लिनक्स के तहत जीसीसी में std :: थ्रेड का उपयोग करने के लिए सही लिंक विकल्प क्या है? Iframe पर क्लिक करें ईवेंट हैंडलर को जोड़ना एंड्रॉइड कैसे अपनी उंगली के बाद एक चिकनी लाइन आकर्षित करने के लिए क्या संग्रह हमेशा आवंटित या कभी-कभी आवंटित ढेर होता है? ऑब्जेक्ट ओरिएंटेड प्रतिमान में ढीले युग्मन और तंग युग्मन के बीच अंतर क्या है? PostgreSQL में स्थान की गणना और बचत करना सूचीव्यू से सभी चेक किए गए आइटम कैसे प्राप्त करें? एसक्यूएल सर्वर 2008 के साथ अधिसूचना बदलें जावास्क्रिप्ट – छवि ऊँचाई प्राप्त करें कैसे डिफ़ॉल्ट जावा ढेर आकार निर्धारित है? लक्ष्य = "_ रिक्त" बनाम लक्ष्य = "_ नया" मैं लिनक्स उबंटू टर्मिनल में एक फ़ोल्डर और उसके सभी सबफ़ोल्डर और फाइलों के लिए chmod कैसे सेट करूं? अजगर sys.intern क्या करता है, और इसे कब उपयोग किया जाना चाहिए? आईओएस कस्टम टैबबार

कैसे वादे के साथ पूर्व परिणामों को चेन और साझा करने के लिए

मैं ब्लूबर्ड पुस्तकालय का उपयोग कर रहा हूं और मुझे HTTP अनुरोधों की एक श्रृंखला बनाने की आवश्यकता है और अगले HTTP अनुरोध के कुछ प्रतिक्रिया डेटा की आवश्यकता है। मैंने एक फ़ंक्शन बनाया है जो callhttp() नामक मेरे अनुरोधों को callhttp() । यह एक यूआरएल और एक पोस्ट का शरीर लेता है।

मैं इसे इस तरह बुला रहा हूं:

 var payload = '{"Username": "joe", "Password": "password"}'; var join = Promise.join; join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), function (first, second, third) { console.log([first, second, third]); }); 

पहला अनुरोध एक एपीआई कुंजी प्राप्त करता है, जिसे दूसरे अनुरोध पर जाने की आवश्यकता होती है और इसी तरह। पहले अनुरोध से प्रतिक्रिया डेटा कैसे प्राप्त करें?

अद्यतन करें

यह callhttp फ़ंक्शन है:

 var Promise = require("bluebird"); var Request = Promise.promisify(require('request')); function callhttp(host, body) { var options = { url: 'https://' + host + '/api/authorize', method: "POST", headers: { 'content-type': 'application/json' }, body: body, strictSSL: false }; return Request(options).spread(function (response) { if (response.statusCode == 200) { // console.log(body) console.log(response.connection.getPeerCertificate().subject.CN) return { data: response.body }; } else { // Just an example, 200 is not the only successful code throw new Error("HTTP Error: " + response.statusCode ); } }); } 

वेब के समाधान से एकत्रित समाधान "कैसे वादे के साथ पूर्व परिणामों को चेन और साझा करने के लिए"

निर्भर वादों के लिए कुछ मॉडल हैं और एक से अगले डेटा तक पास कर रहे हैं जो सबसे अच्छा काम करता है उस पर निर्भर करता है कि क्या आपको अगली कॉल में पिछले डेटा की आवश्यकता है या क्या आपको सभी पूर्व डेटा तक पहुंच की आवश्यकता है या नहीं। यहां कई मॉडल हैं:

अगले के एक के लिए फ़ीड परिणाम

 callhttp(url1, data1).then(function(result1) { // result1 is available here return callhttp(url2, data2); }).then(function(result2) { // only result2 is available here return callhttp(url3, data3); }).then(function(result3) { // all three are done now, final result is in result3 }); 

मध्यवर्ती परिणाम उच्च स्कोप में निर्दिष्ट करें

 var r1, r2, r3; callhttp(url1, data1).then(function(result1) { r1 = result1; return callhttp(url2, data2); }).then(function(result2) { r2 = result2; // can access r1 or r2 return callhttp(url3, data3); }).then(function(result3) { r3 = result3; // can access r1 or r2 or r3 }); 

एक वस्तु में परिणाम एकत्रित करें

 var results = {}; callhttp(url1, data1).then(function(result1) { results.result1 = result1; return callhttp(url2, data2); }).then(function(result2) { results.result2 = result2; // can access results.result1 or results.result2 return callhttp(url3, data3); }).then(function(result3) { results.result3 = result3; // can access results.result1 or results.result2 or results.result3 }); 

नेस्ट, तो सभी पिछला परिणाम तक पहुंचा जा सकता है

 callhttp(url1, data1).then(function(result1) { // result1 is available here return callhttp(url2, data2).then(function(result2) { // result1 and result2 available here return callhttp(url3, data3).then(function(result3) { // result1, result2 and result3 available here }); }); }) 

चेन को स्वतंत्र टुकड़ों में तोड़ो, परिणाम एकत्र करें

यदि चेन के कुछ हिस्सों को स्वतंत्र रूप से आगे बढ़ना है, तो दूसरे के बाद एक के बजाय, आप उन्हें अलग से लॉन्च कर सकते हैं और Promise.all() का उपयोग कर सकते हैं, यह जानने के लिए कि ये कई टुकड़े किए गए हैं और तब आपके पास उन स्वतंत्र टुकड़ों के सभी आंकड़े होंगे :

 var p1 = callhttp(url1, data1); var p2 = callhttp(url2, data2).then(function(result2) { return someAsync(result2); }).then(function(result2a) { return someOtherAsync(result2a); }); var p3 = callhttp(url3, data3).then(function(result3) { return someAsync(result3); }); Promise.all([p1, p2, p3]).then(function(results) { // multiple results available in results array // that can be processed further here with // other promises });