একটি কৌণিক promise q প্রতিশ্রুতি সমাধান হয়েছে কিনা তা কীভাবে পরীক্ষা করবেন


84

আমি বুঝতে পারি যে then()প্রতিশ্রুতি ব্যবহার করার সময় সাধারণত কেউ কল এবং চেইন আচরণের সাথে কেবল ধারাবাহিকতা কোড সংযুক্ত করে।

তবে, আমি একটি প্রতিশ্রুতিযুক্ত মোড়কযুক্ত অ্যাসিঙ্ক্রোনাস কলটি বন্ধ করতে চাই এবং তারপরে পৃথকভাবে একটি 3-সেকেন্ড কিক $timeout()করতে চাই যাতে আমি একটি ইউআই ব্যবস্থা নিতে পারি, কেবলমাত্র যদি আসল প্রতিশ্রুতি এখনও পূরণ না হয়। (আমি প্রত্যাশা করি যে এটি কেবল ধীর সংযোগ, 3 জি-র মোবাইল ডিভাইস ইত্যাদিতেই ঘটবে)

একটি প্রতিশ্রুতি দেওয়া হয়েছে, আমি পরীক্ষা করতে পারি এটি ব্লক করা বা অপেক্ষা না করেই সম্পূর্ণ কিনা না?


4
আমি এই বিষয়ে কৌণিকভাবে
derekdreery

সম্ভাব্য সদৃশ stackoverflow.com/questions/27039771/...
mvermand

উত্তর:


46

আমার ধারণা এঙ্গুলারের সাম্প্রতিক সংস্করণে এটি যুক্ত হয়েছিল তবে প্রতিশ্রুতিতে এখন এটি একটি $$ রাষ্ট্রীয় অবজেক্ট বলে মনে হচ্ছে:

 var deferred = $q.defer();
 console.log(deferred.promise.$$state.status); // 0
 deferred.resolve();
 console.log(deferred.promise.$$state.status); //1 

মন্তব্যে উল্লিখিত হিসাবে এটি প্রস্তাবিত নয় কারণ এটি আপনার কৌণিক সংস্করণটি আপগ্রেড করার সময় ভেঙে যেতে পারে।


25
কৌণিক ডক্স বলে যে $$...বৈশিষ্ট্যগুলি ব্যবহার করা উচিত নয়।
কৌনিকটির

7
খুব খারাপ কৌণিক একটি সিলভার প্লেটারে তার ব্যক্তিগত ভেরিয়েবলগুলি সরবরাহ করে। :(
জ্যাকসন

4
: এছাড়াও দেখুন stackoverflow.com/questions/27039771/...
mvermand

4
তবে ... কিন্তু কৌণিক কার্যটি কার্যকর করেনি inspect। সুতরাং আমাদের জন্য অ্যাঙ্গুলার ডেভসের কোনও রস নেই। প্রতিশ্রুতি প্রোটোটাইপ কেবল এটি না।
রবার্ট কোরিটনিক

36

আমি মনে করি আপনার সেরা বিকল্পটি হ'ল, (কৌনিক উত্সটি পরিবর্তন না করে এবং একটি অনুরোধ জমা না দিয়ে) যদি প্রতিশ্রুতিটি সমাধান হয়ে যায় তবে এর জন্য স্থানীয় পতাকা রাখা। আপনার প্রতি আগ্রহী প্রতিশ্রুতিটি সেটআপ করার সময় এটি পুনরায় সেট করুন then()এবং আসল প্রতিশ্রুতির জন্য এটি সম্পূর্ণ হিসাবে চিহ্নিত করুন । ইন $timeout then()চেক পতাকা জানেন যে যদি মূল প্রতিশ্রুতি এখনো বা না সমস্যাগুলি সমাধান করা হয়েছে।

এটার মতো কিছু:

var promiseCompleted = false;
promise.then(function(){promiseCompleted=true;})
$timeout(...).then(function(){if(!promiseCompleted)doStuff()})

ক্রিস কোওয়ালের বাস্তবায়নে প্রতিশ্রুতির অবস্থা যাচাই করার জন্য অন্যান্য পদ্ধতি অন্তর্ভুক্ত রয়েছে তবে $qদুর্ভাগ্যক্রমে অ্যাঙ্গুলার বাস্তবায়নে এগুলি অন্তর্ভুক্ত করা হয়নি বলে মনে হয়।


9
এখানে .ফাইনালি () ব্যবহার করা ভাল। উপরের প্রদত্ত কোডটি কেবলমাত্র প্রতিশ্রুতিবদ্ধ পতাকাটিকে সত্য হিসাবে চিহ্নিত করা হয়েছে যদি এটি সফলভাবে সমাধান হয়ে যায়।
করণভীর কং

8

এটি সম্ভব হবে বলে মনে হচ্ছে না, যেমনটি ইতিমধ্যে @ শনহুসাইন উল্লেখ করেছেন। তবে সম্ভবত এটি প্রয়োজনীয় নয়:

// shows stuff from 3s ahead to promise completetion, 
// or does and undoes it in one step if promise completes before
$q.all(promise, $timeout(doStuff, 3000)).then(undoStuff);

বা সম্ভবত আরও ভাল:

var tooSlow = $timeout(doStuff, 3000);
promise.always(tooSlow.cancel);

1

আমারও অনুরূপ সমস্যা হয়েছিল যেখানে আমার কোনও প্রতিশ্রুতি ফিরে এসেছে কিনা তা যাচাই করা দরকার। কারণ AngularJS এর$watch ফাংশনটি পৃষ্ঠাটি রেন্ডার করার সময় একটি পরিবর্তন নিবন্ধভুক্ত করবে এমনকি নতুন এবং পুরানো উভয় মানই অপরিজ্ঞাত থাকলেও, আমার বাহ্যিক মডেলটিতে সঞ্চয় করার মতো কোনও ডেটা আছে কিনা তা পরীক্ষা করে দেখতে হবে।

এটি অবশ্যই একটি হ্যাক তবে আমি এটি করি:

$scope.$watch('userSelection', function() {
  if(promiseObject.hasOwnProperty("$$v"){
    userExportableState.selection = $scope.userSelection;
  }
};

আমি জানি যে $$vএটি অ্যাঙ্গুলারজেএস দ্বারা ব্যবহৃত একটি অভ্যন্তরীণ পরিবর্তনশীল তবে এটি আমাদের জন্য সমাধান প্রতিশ্রুতির সূচক হিসাবে যথেষ্ট নির্ভরযোগ্য reliable আমরা যখন AngularJS 1.2 তে আপগ্রেড করব তখন কী হবে কে জানে: - / আমি 1.2 ডক্সে উন্নতির কোনও উল্লেখ দেখতে পাই না $qতবে সম্ভবত কেউ Q এর কাছাকাছি আরও ভাল বৈশিষ্ট্যযুক্ত একটি প্রতিস্থাপন পরিষেবা লিখবে।


ধন্যবাদ, তবে "ব্যক্তিগত" সদস্যদের ব্যবহার করার চেয়ে আরও ভাল বিকল্প রয়েছে।
জ্যাকসন

0

আমি আপনার সঠিক পরিস্থিতিটি জানি না তবে অ্যাসিনক্রোনাস কল করার সাথে সাথে (এবং প্রতিশ্রুতি উত্পন্ন করার পরে) সময়সীমা স্থির করা আরও সাধারণ is

setTimeout()বিবৃতি প্রদান অ্যাসিঙ্ক্রোনাস কল হিসাবে একই ইভেন্ট থ্রেডে রয়েছে, আপনাকে কোনও রেসের প্রভাবের সম্ভাবনা সম্পর্কে চিন্তা করার দরকার নেই। যেহেতু জাভাস্ক্রিপ্টটি কঠোরভাবে একক থ্রেডযুক্ত, প্রতিশ্রুতির .then()কলব্যাকগুলি পরবর্তী ইভেন্টের থ্রেডে আগুন দেওয়ার গ্যারান্টিযুক্ত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.