मैं राकू में एक वादा कैसे कर सकता हूं?


9

मुझे पता है कि मैं Promiseएक निश्चित समय के साथ रखा जा सकता है

my $promise = Promise.in($seconds);

लेकिन मैं इसे तोड़ने के लिए कैसे शेड्यूल कर सकता हूं? विशेष रूप से, मैं एक ऐसे वादे के बारे में सोच रहा हूं जो "टाइमआउट" होगा, ताकि इसे एक निश्चित समय तक रखा जाए या फिर यह विफल हो जाए।

मैं ऐसा दूसरे के साथ कर सकता हूं Promise, जैसे:

my $promise = Promise.new;
...
Promise.in($seconds).then: { $promise.break };

लेकिन यह थोड़ा ... बेकार लगता है। क्या ऐसा करने के लिए इससे अच्छा तरीका है?

जवाबों:


10

एक सामान्य पैटर्न कुछ इस तरह से लिखना है:

await Promise.anyof($the-promise, Promise.in(10));
if $the-promise {
    # it finished ahead of the timeout
}
else {
    # it timed out
}

यह अपने आप को एक टूटी-फूटी के रूप में प्रकट नहीं करता है Promise, हालांकि यह सब बुरा नहीं है (क्योंकि आपको कई मामलों में किसी भी तरह से रद्द करने की त्रुटि को अलग करने की आवश्यकता है, इसलिए आपको अभी भी अपवाद प्रकार पर कुछ मिलान करना होगा)। इस फैक्टरिंग का भी फायदा है$the-promise कि इसे रखने / तोड़ने के लिए आपके पास एक नहीं होना चाहिए।

कोई इसे इस तरह से लपेट सकता है:

class TimedOut is Exception {}
sub timeout($promise, $time) {
    start {
        await Promise.anyof($promise, Promise.in($time));
        $promise ?? await($promise) !! die(TimedOut.new)
    }
}

जो फिर से किसी के साथ काम करेगा $promise, परिणाम या अपवाद पर पारित करेगा, और अन्यथा समयबद्ध अपवाद को फेंक देगा।

इन सभी को ध्यान में रखने वाली बात यह है कि वे वास्तव में प्रगति में काम को रद्द करने पर कोई प्रभाव नहीं डालते हैं। यह महत्वपूर्ण नहीं है, या यह महत्वपूर्ण हो सकता है। यदि बाद वाला, आप शायद चाहते हैं:

  • एक है Promiseकि आप रद्द जगह लेने के लिए उपयोग करने के लिए; आप इसे रद्द करते समय रखते हैं, और इसे उस कोड में प्रदूषित करते हैं जो रद्द कर देगा
  • इसके Supplyबजाय प्रतिमान का उपयोग करने के लिए, जहां एक रद्दीकरण मॉडल (नल को बंद करना) है।

3
धन्यवाद। यह उपयोगी है। और बहुत कम से कम यह घर चलाता है कि वादे सस्ते होते हैं (!) और उनका उपयोग करना जैसे आप सुझाव देते हैं, या मैंने मूल रूप से कैसे सोचा था, ठीक है। यह अभी भी महसूस करता है कि "(अधिक?) सीधा कहने का तरीका होना चाहिए" अगर यह वादा एक्स सेकंड में नहीं रखा गया है, तो इसे "टूटा हुआ" मानें। मुझे लगता है कि यह सभी मामलों में समझ में नहीं आएगा, लेकिन मुझे लगता है कि यह निश्चित रूप से कुछ में समझ में आता है।
जज

3
यह शायद भविष्य में आएगा, हालांकि शायद तभी जब हमारे पास Promiseकोर में कुछ प्रकार के रद्द करने के प्रावधान होंगे, क्योंकि इसके शब्दार्थ कुछ हद तक उन लोगों के साथ बंधे होंगे।
जोनाथन वर्थिंगटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.