आप कहते हैं कि फ़ाइल 2/3 "समान सामग्री" हैं लेकिन वे एक महत्वपूर्ण क्षेत्र में नहीं हैं। promisifyAll
. के लिए ब्लूबर्ड के दस्तावेज़ के अनुसार (देखें http://bluebirdjs.com/docs/api/promise.promisifyall.html), यह सुविधा एक ...Async
बनाती है रेडिस क्लाइंट में प्रत्येक कोर फ़ंक्शन का संस्करण। आप hmgetAsync
. पर कॉल करें आपके पहले मामले में, लेकिन आप केवल hmget
. पर कॉल करते हैं अपने दूसरों में।
यह महत्वपूर्ण है क्योंकि आप एक एसिंक पैटर्न का उपयोग कर रहे हैं लेकिन एक गैर-एसिंक कोड संरचना के साथ। File2/3 में आप result1
. सेट करते हैं async कॉलबैक के अंदर, लेकिन फिर कॉल के वापस आने से पहले इसे प्रत्येक कॉल के नीचे वापस कर दें।
आपके पास दो विकल्प हैं:
1:आप redis क्लाइंट के अलावा कॉलबैक में पास करके file2/3/etc को पूरी तरह से पारंपरिक पैटर्न में बदल सकते हैं:
module.exports = function(redisclient, callback){
result1
returning लौटाने के बजाय , तो आप इस मान के साथ कॉलबैक को कॉल करेंगे:
if(redisValue == 'test value'){
callback(null, "success");
} else {
callback("failed", null);
}
2:आप file2/3/..N को प्रॉमिस-बेस्ड में कनवर्ट कर सकते हैं, इस मामले में आपको promisifyAll(require(...))
की जरूरत नहीं है। उन्हें - आप बस require()
. कर सकते हैं उन्हें। ऐसा पैटर्न कुछ इस तरह दिख सकता है:
module.exports = function(redisclient){
return redisclient.hmgetAsync("testdata", "text1");
};
यह एक बहुत ही सरल और साफ-सुथरा विकल्प है, और यदि आप इसके साथ चलते रहते हैं तो आप देख सकते हैं कि आप शायद आवश्यकता () को भी समाप्त कर सकते हैं और बस hmgetAsync
करें। फ़ाइल 1 में कैसंड्रा द्वारा लौटाए गए उपयुक्त डेटा के साथ। लेकिन आपकी विशिष्ट एप्लिकेशन आवश्यकताओं को देखे बिना यह जानना कठिन है। किसी भी घटना में, वादा-आधारित पैटर्न आम तौर पर बहुत छोटे और साफ-सुथरे होते हैं, लेकिन हमेशा बेहतर नहीं होते - उनका उपयोग करने के लिए एक मध्यम प्रदर्शन ओवरहेड होता है। यह आपकी कॉल है कि आप किस तरफ जाते हैं - या तो काम करेगा।