2012-04-12 18 views
93

में अपवाद मैंने एक डेमॉन बनाया था जो ipc (टेलनेट का एक बहुत ही प्राचीन रूप का उपयोग करता था और एक स्ट्रिंग भेजता था जिसमें एक निश्चित क्रम में कुछ शब्द थे)। मैंने इसे बाहर निकाला और Yesod सर्वर पर संदेशों को पास करने के लिए अब JSON का उपयोग कर रहा हूं। हालांकि, कुछ चीजें मुझे वास्तव में मेरे डिजाइन के बारे में पसंद आईं, और मुझे यकीन नहीं है कि मेरे विकल्प अब क्या हैं।यसोड

यहाँ मैं क्या कर रहा था है:

buildManager :: Phase -> IO() 
buildManager phase = do 
    let buildSeq = findSeq phase 
     jid = JobID $ pack "8" 
     config = MkConfig $ Just jid 
    flip C.catch exceptionHandler $ 
    runReaderT (sequence_ $ buildSeq <*> stages) config 
    -- ^^ I would really like to keep the above line of code, or something like it. 
    return() 

buildSeq में प्रत्येक कार्य इस

foo :: Stage -> ReaderT Config IO() 

data Config = MkConfig (Either JobID Product) BaseDir JobMap 

JobMap की तरह देखा एक TMVar Map कि वर्तमान नौकरियों के बारे में जानकारी को ट्रैक करता है।

तो अब, हैंडलर, वह सब इस

foo :: Handler RepJson 

foo की तरह लग रही मेरी डेमॉन के लिए एक कमांड का प्रतिनिधित्व करता है कि मैं क्या है, प्रत्येक हैंडलर एक अलग JSON ऑब्जेक्ट पर कार्रवाई करने के लिए हो सकता है।

मैं जो करना चाहता हूं वह एक JSON ऑब्जेक्ट भेजता है जो सफलता का प्रतिनिधित्व करता है, और एक और JSON ऑब्जेक्ट जो कुछ अपवाद के बारे में जानकारी को दबाता है।

मैं foo रों सहायक समारोह एक Either लौटने में सक्षम होना चाहते हैं, लेकिन मुझे यकीन है कि मैं यह कैसे प्राप्त नहीं कर रहा हूँ, के साथ साथ कार्रवाई की मेरी सूची, buildSeq के मूल्यांकन को समाप्त करने की क्षमता।

यहाँ एकमात्र विकल्प मैं

1) यकीन है कि exceptionHandler हैंडलर में है देखते हैं। App रिकॉर्ड में JobMap रखो। getYesodJobMap में उचित मान अपवाद के बारे में विवरण का संकेत, जो तब तक foo

वहाँ एक बेहतर तरीका है पहुँचा जा सकता है बदल ले रहे हैं?

मेरे अन्य विकल्प क्या हैं?

संपादित करें: स्पष्टता के लिए, मैं Handler RepJson की भूमिका की व्याख्या करूंगा। सर्वर को buildstopreport जैसे आदेशों को स्वीकार करने के किसी तरीके की आवश्यकता है। ग्राहक को इन आदेशों के परिणामों को जानने के कुछ तरीके की आवश्यकता है। मैंने JSON को माध्यम के रूप में चुना है जिसके साथ सर्वर और क्लाइंट एक दूसरे के साथ संवाद करते हैं। मैं JSON इन/आउट प्रबंधित करने के लिए हैंडलर प्रकार का उपयोग कर रहा हूं और कुछ और नहीं।

उत्तर

9

दाससेल/यसोड दुनिया में दार्शनिक रूप से बोलते हुए, आप उन्हें पीछे की ओर लौटने के बजाय मूल्यों को आगे बढ़ाना चाहते हैं। तो हैंडलर को एक मूल्य वापस करने की बजाय, उन्हें प्रक्रिया में अगले चरण में आगे कॉल करें, जो एक अपवाद उत्पन्न करने के लिए हो सकता है।

याद रखें कि आप भविष्य में किसी भी ऑब्जेक्ट को किसी ऑब्जेक्ट में बंडल कर सकते हैं, ताकि आप अपने हैंडलर और फूज़ को निरंतर ऑब्जेक्ट पास कर सकें जो मूल रूप से उन्हें बताता है, "आपके काम करने के बाद, कोड का यह ब्लॉब चलाएं।" इस तरह वे शून्य हो सकते हैं और कुछ भी वापस नहीं कर सकते हैं।

+0

आपकी अंतर्दृष्टि के लिए धन्यवाद, टायलर डर्डन। –

संबंधित मुद्दे