সমাধানের প্রতিশ্রুতি কখনই মেমরি ফাঁসের কারণ নয়?


92

আমি একটি আছে Promise। আমি প্রয়োজন হলে একটি এজেএক্স অনুরোধ বাতিল করার জন্য এটি তৈরি করেছি। তবে যেহেতু আমাকে সেই এজ্যাক্স বাতিল করার দরকার নেই, তাই আমি কখনই এটি সমাধান করেছি না এবং এজেএক্স সফলভাবে শেষ হয়েছে।

একটি সরলীকৃত স্নিপেট:

var defer = $q.defer();
$http({url: 'example.com/some/api', timeout: defer.promise}).success(function(data) {
    // do something
});

// Never defer.resolve() because I don't need to cancel that ajax. What happens to this promise after request?

মেমরি ফাঁসের কারণ হিসাবে কখনও প্রতিশ্রুতি সমাধান না? কীভাবে Promiseজীবনচক্র পরিচালনা করবেন সে সম্পর্কে আপনার কোনও পরামর্শ আছে ?


4
একটি "কখনও সমাধান হয়নি" প্রতিশ্রুতি এখনও "প্রত্যাখ্যান" হতে পারে। আপনি যে শব্দটির সন্ধান করছেন তা ছিল "অসম্পূর্ণ"।
স্টিভেন ওয়াচন

$ এইচটিপি একটি আকর্ষণীয় উদাহরণ কারণ অবশেষে একটি এইচটিটিপি অনুরোধের সময়সীমা শেষ হবে (বা অন্যথায় কোনও ত্রুটির প্রতিক্রিয়া উত্পন্ন করবে), যদি ক্লায়েন্টটি 'টাইমআউট' আর্গুমেন্টে প্রদত্ত প্রতিশ্রুতি নির্বিশেষে সার্ভারে পৌঁছাতে না পারে।
ryanwebjackson

উত্তর:


145

ঠিক আছে, আমি ধরে নিচ্ছি যে আপনি এটির একটি সুস্পষ্ট রেফারেন্স রাখবেন না কারণ এটি বরাদ্দ রাখতে বাধ্য করবে।

আমি যে সহজ পরীক্ষাটি ভাবতে পারি তা হ'ল আসলে প্রচুর প্রতিশ্রুতি বরাদ্দ করা এবং সেগুলি সমাধান করা নয়:

var $q = angular.injector(["ng"]).get("$q");
setInterval(function () {
    for (var i = 0; i < 100; i++) {
        var $d = $q.defer();
        $d.promise;
    }
}, 10);

এবং তারপরে নিজেই গাদা দেখছে। আমরা ক্রোম প্রোফাইলিং সরঞ্জামগুলিতে দেখতে পাচ্ছি যে এটি 100 টি প্রতিশ্রুতি বরাদ্দ করার জন্য প্রয়োজনীয় মেমরিটি সংগ্রহ করে এবং তারপরে পুরো জেএসএফআইডল পৃষ্ঠাটির জন্য 15 মেগাবাইটের চেয়ে কম "সেখানে থাকে"

এখানে চিত্র বর্ণনা লিখুন

অন্য দিক থেকে, যদি আমরা $qউত্স কোড তাকান

আমরা দেখতে পাচ্ছি যে গ্লোবাল পয়েন্ট থেকে কোনও নির্দিষ্ট প্রতিশ্রুতির কোনও রেফারেন্স নেই তবে কেবল তার কলব্যাকের প্রতিশ্রুতি থেকে। কোডটি খুব পঠনযোগ্য এবং স্পষ্ট। আসুন দেখুন যদি আপনার কাছে কলব্যাক থেকে প্রতিশ্রুতির কোনও রেফারেন্স থাকে তবে।

var $q = angular.injector(["ng"]).get("$q");
console.log($q);
setInterval(function () {
    for (var i = 0; i < 10; i++) {
        var $d = $q.defer();
        (function ($d) { // loop closure thing
            $d.promise.then(function () {
                console.log($d);
            });
        })($d);
    }
}, 10);

এখানে চিত্র বর্ণনা লিখুন

তাই প্রাথমিক বরাদ্দের পরে - দেখে মনে হচ্ছে এটি এটি হ্যান্ডেল করতেও সক্ষম হয়েছে :)

আমরা যদি তার শেষ উদাহরণটি আরও কয়েক মিনিটের জন্য চালিত করি তবে আমরা জিসির কিছু আকর্ষণীয় নিদর্শনগুলিও দেখতে পারি। আমরা দেখতে পাচ্ছি যে এটি কিছুটা সময় নেয় - তবে এটি কলব্যাকগুলি সাফ করতে সক্ষম।

এখানে চিত্র বর্ণনা লিখুন

সংক্ষেপে - কমপক্ষে আধুনিক ব্রাউজারগুলিতে - সমাধান না হওয়া প্রতিশ্রুতিগুলির যতক্ষণ না আপনার কাছে বাহ্যিক রেফারেন্স না থাকে আপনার চিন্তার দরকার নেই


8
এর অর্থ কি এই নয় যে কোনও প্রতিশ্রুতি সমাধানের জন্য খুব বেশি সময় নিলে (তবে শেষ পর্যন্ত সমাধান হবে), এটি জিসিড হওয়ার ঝুঁকিতে রয়েছে?
w.brian

6
@ w.brian যদি না আপনি এটিকে অন্য কোথাও বরাদ্দ করেন - উদাহরণস্বরূপ একটি ভেরিয়েবলের কাছে: var b = $http.get(...)বা এতে একটি কলব্যাক যোগ করুন। এটিতেও এটির একটি উল্লেখ রয়েছে। যদি কিছু সমাধান করে (যেমন আপনি বলেছিলেন - সমাধানের পক্ষে অনেক দীর্ঘ অর্থ সমাধানের অর্থ) - এটির একটি উল্লেখ থাকতে হবে। তাই হ্যাঁ - এটি জিসিডি হবে না
গ্রুইনবাউম

4
গোছা, এটাই আমি ভেবেছিলাম। সুতরাং, প্রশ্নটি হ'ল "কি কখনও প্রতিশ্রুতিগুলি সমাধান করা মেমরি ফাঁসের কারণ নয়?" উত্তর, সাধারণ ব্যবহারের ক্ষেত্রে যেখানে কলব্যাক প্রতিশ্রুতিতে পাঠানো হয়, হ্যাঁ। আপনার উত্তরের এই লাইনটি এর বিরোধিতা বলে মনে হচ্ছে: "আমরা যদি তার শেষ উদাহরণটি আরও কয়েক মিনিট চালাতে পারি তবে আমরা জিসির কিছু আকর্ষণীয় নিদর্শনগুলিও দেখতে পারি can আমরা দেখতে পাচ্ছি যে এটি কিছুটা সময় নেয় - তবে এটি কলব্যাকগুলি সাফ করতে সক্ষম। " দুঃখিত যদি আমি পেডেন্টিক এবং নিট-পিক হয়ে যাচ্ছি, আমি কেবল এটি বুঝতে পেরেছি তা নিশ্চিত করার চেষ্টা করছি।
w.brian

4
এটি আমার কাছে বোধগম্য মনে হয় না। যদি আমি 100.000 প্রতিশ্রুতি তৈরি করেছি যে কনসোল.লগ () 'এর কিছু লাইন এড করেছে। আমি 100.000 যারা লাইনগুলি হঠাৎ করে কোনও যাদু দ্বারা সমাধান করে সেগুলি লগ করতে চাই। বা আপনি কি বলছেন যে ব্রাউজারটি বুঝতে পারে যে এটি কখনই সমাধান হবে না , যেহেতু আমার বা প্রকৃত ব্রাউজারের কোনওটিরই কোনও উল্লেখ নেই (কিছুই এর প্রভাবিত করে না) - তবে কীভাবে এটি সত্য হতে পারে? (হুম, আমি দেখতে পাচ্ছি এটি সত্য হতে পারে)
ওডিনহো - ভেলমন্ট

9
এই মন্তব্যে কিছু সত্য এবং বিভ্রান্তিমূলক কিছু রয়েছে, সুতরাং আমাকে স্পষ্ট করে বলি: সংযুক্ত হ্যান্ডলারের সাথে একটি প্রতিশ্রুতি আবর্জনা সংগ্রহের জন্য উপযুক্ত হতে পারে। ওয়াদা পূরণ জীবিত (না জিসি-যোগ্য) যদি রাখা হয় কোন (1) সেখানে প্রতিশ্রুতি বস্তুর একটি রেফারেন্স, (2) সেখানে প্রতিশ্রুতি "বিলম্বিত" অবস্থায় একটি রেফারেন্স (বস্তু হল: নিচের সত্য / ফাংশনগুলি আপনি এটি সমাধান / প্রত্যাখ্যান করার জন্য ব্যবহার করেন)। এর বাইরে, প্রতিশ্রুতিটি সিসির জন্য যোগ্য। (যদি কারও কাছে প্রতিশ্রুতি না থাকে এবং কেউ তার রাষ্ট্র পরিবর্তন করতে না পারে তবে এর উদ্দেশ্য কী, যাইহোক?)
সিডিউইউই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.