আমি কীভাবে রাকুতে একটি প্রতিশ্রুতি শেষ করতে পারি?


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, ফলাফল বা ব্যতিক্রমটি পাস করবে এবং সময়সাপেক্ষ ব্যতিক্রমকে নষ্ট করবে otherwise

এই সমস্তগুলির সাথে মাথায় রাখার বিষয়টি হ'ল তারা প্রকৃতপক্ষে কোনও কাজ বাতিল করার ক্ষেত্রে প্রভাব ফেলবে না। এটি গুরুত্বপূর্ণ নয়, বা এটি গুরুত্বপূর্ণ হতে পারে। যদি দ্বিতীয়টি হয় তবে আপনি সম্ভবত:

  • একজন Promiseযে আপনার বাতিলের বোঝাতে ব্যবহার সঞ্চালিত থাকার; বাতিল করার সময় আপনি এটি রাখেন, এবং কোডটি পোল করুন যা বাতিলকরণ করবে
  • Supplyপরিবর্তে দৃষ্টান্তটি ব্যবহার করার জন্য, যেখানে একটি বাতিলকরণ মডেল রয়েছে (ট্যাপটি বন্ধ করে দেওয়া হচ্ছে)।

3
ধন্যবাদ। এটি দরকারী। এবং খুব কমপক্ষে এটি বাড়িতে চালিত করে যে প্রতিশ্রুতিগুলি সস্তা (!) এবং আপনার পরামর্শ মতো বা সেগুলি ব্যবহার করার মতো, বা আমি কীভাবে মূলত ভেবেছিলাম তা ঠিক। এটি এখনও মনে হচ্ছে "এই প্রতিশ্রুতিটি যদি X সেকেন্ডে না রাখা হয় তবে এটি ভাঙ্গা বিবেচনা করুন" বলার সোজা উপায় থাকার (আরও?) হওয়া উচিত। আমি পেয়েছি যে এটি সব ক্ষেত্রে অর্থবোধ করে না, তবে আমি মনে করি এটি কিছুটা ক্ষেত্রে অবশ্যই বোধগম্য।
জেজে

3
এটি সম্ভবত ভবিষ্যতে আসবে, তবে সম্ভবত কেবল তখনই যখন আমরা Promiseমূলত কিছু ধরণের বাতিল বিধান রাখি , কারণ এর শব্দার্থক শব্দগুলি এর সাথে কিছুটা বেঁধে দেওয়া হবে।
জোনাথন ওয়ারিংটন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.