যখন Angular.js তে কোনও প্রতিশ্রুতি পূর্ণ হয় তখন কীভাবে সর্বদা কিছু কোড চালানো যায়


83

আমার Angular.js অ্যাপ্লিকেশনটিতে, আমি কিছু অ্যাসিনক্রোনাস অপারেশন চালাচ্ছি। এটি শুরু হওয়ার আগে আমি অ্যাপ্লিকেশনটি একটি মডেল ডিভ দিয়ে কভার করব, তারপরে একবার অপারেশন সম্পূর্ণ হয়ে গেলে, ডিভটি অপসারণ করা দরকার, অপারেশন সফল হয়েছিল কি না।

বর্তমানে আমার কাছে এটি রয়েছে:

LoadingOverlay.start(); 
Auth.initialize().then(function() {
    LoadingOverlay.stop();
}, function() {
    LoadingOverlay.stop(); // Code needs to be duplicated here
})

এটি ভালভাবে কাজ করে, তবে আমি এই সিডো-কোডের মতো পরিষ্কার কিছু পছন্দ করতে চাই:

LoadingOverlay.start(); 
Auth.initialize().finally(function() { // *pseudo-code* - some function that is always executed on both failure and success.
    LoadingOverlay.stop();
})

আমি ধরে নিলাম এটি বেশ সাধারণ সমস্যা, তাই আমি ভাবছিলাম এটি করা যেতে পারে তবে ডকটিতে কিছুই খুঁজে পাচ্ছি না। কোন ধারণা যদি এটি করা যায়?


আপনি শৃঙ্খল এক করতে পারেন then(), তাহলে আপনি নিশ্চয় অন্য চেইন করতে পারেন ... .initialize().then(...).then(...)। এর মতো কোনও "অবশেষে" নেই; চূড়ান্ত হ্যান্ডলারটি নির্দিষ্ট করা শেষ is
বিটরুট-বিটরুট

4
@ বিটরুট-বিটরুট এটি কার্যকর করবে না কারণ যদি initialize()ব্যর্থ হয় তবে আপনাকে সেখানে "সাফল্য" ফাংশন এবং একটি "ব্যর্থ" ফাংশন এবং নকল কোড উভয়ই ঘোষণা করতে হবে।
লরেন্ট

কাজ করবে না, বা কেবল অবহেলিত?
বিটরুট-বিটরুট

4
লরেন্ট, আপনি যা চান বর্তমানে অ্যাঙ্গুলারের লাইটওয়েট $ q পরিষেবাতে উপলব্ধ নেই, যা কেবল একটি পদ্ধতি দিয়ে প্রতিশ্রুতি দেয় .then()- এখানে "প্রতিশ্রুতি এপিআই" দেখুন । একমাত্র স্বাধীনতা হ'ল এক .then()বা একাধিক .then()গুলি চেইন করা । আপনি আরও বিস্তৃত প্রতিশ্রুতি এপিআইয়ের জন্য প্রথমে চান না - আপনি যে বৈশিষ্ট্যটি চান তা এখানে আনুষ্ঠানিকভাবে অনুরোধ করা হয়েছে
বিটরুট-বিটরুট

4
দৃশ্যত always(callback)প্রয়োগ করা হয় না বা কৌণিক 1.2.6 এ ফিরে ঘূর্ণিত হয়। আমাদের finallyএখন ব্যবহার করতে হবে । আমি ভাবছি কেন সংরক্ষিত শব্দটির finallyচেয়ে ভাল always
অ্যালেনা

উত্তর:


164

বৈশিষ্ট্যটি এই টান অনুরোধে প্রয়োগ করা হয়েছে এবং এটি এখন AngularJS এর ​​অংশ part এটিকে প্রথমে "সর্বদা" বলা হত এবং এরপরে নামকরণ করা হয় finally, সুতরাং কোডটি নিম্নলিখিত হিসাবে হওয়া উচিত:

LoadingOverlay.start(); 
Auth.initialize().then(function() {
    // Success handler
}, function() {
    // Error handler
}).finally(function() {
    // Always execute this on both error and success
});

মনে রাখবেন যেহেতু finallyএকটি সংরক্ষিত কীওয়ার্ড তাই এটি একটি স্ট্রিং তৈরি করার প্রয়োজন হতে পারে যাতে এটি নির্দিষ্ট ব্রাউজারগুলিতে (যেমন আইআই এবং অ্যান্ড্রয়েড ব্রাউজার) উপর ব্রেক না করে:

$http.get('/foo')['finally'](doSomething);

10
যে কোনও ওয়েব অনুসন্ধান থেকে এটি সন্ধানের জন্য, উত্তরের লিঙ্কটি ফাংশনটির উল্লেখ করেছে alwaysতবে finallyআপনি এই প্রতিশ্রুতিতে (বা উত্সে) দেখতে পাওয়ায় এটিতে
অস্টিন থম্পসন

@ অস্টিনথম্পসন, তথ্যের জন্য ধন্যবাদ, আমি পোস্টটি আপডেট করেছি।
লরেন্ট

@ this.lau_ কি চূড়ান্তভাবে শেষ পর্যন্ত () চূড়ান্ত কল হতে হবে, না আমি আরও চেইন করতে পারি () এর বাইরে গেলে?
ব্রায়ান

4
আপনি স্যার, আমার দিন তৈরি!
জ্যাকবএফ

4
@ ব্রায়ান বাকিদের finallyমতো ঠিক একটি প্রতিশ্রুতি ফেরান , যাতে আপনি এটি শৃঙ্খলিত করতে পারেন। তবে সুবিধার overloads (কৌণিক কিছু সংস্করণের উপর অন্তত) successএবং errorশুধুমাত্র তাত্ক্ষণিক আগমন যোগ করা হয় $http, তাই আপনি যদি শুরু সঙ্গে finallyআপনি ঐ পদ্ধতি হারাবেন।
ড্রাজস

7

আমি আম্বারকো সংস্করণটি ular.৩.৫ ব্যাক এন্ডুলার জেএস সংস্করণ ১.১.৫ সহ ব্যবহার করছি এবং এই থ্রেডটি পেয়েছি। যখন আমি অনুমোদিত উত্তরটি প্রয়োগ করি তখন আমি ত্রুটি পেয়েছি:

xxx (...)। তারপর (...)। অবশেষে কোনও ফাংশন নয়

কাজটি কিন্তু কি ছিল always। অ্যাঙ্গুলারজেএস-এর একটি পুরাতন সংস্করণ ব্যবহার করা অন্য কেউ যদি এই থ্রেডটি খুঁজে পান এবং finallyপরিবর্তে এই কোডটি ব্যবহার করতে পারবেন না

LoadingOverlay.start(); 
Auth.initialize().then(function() {
    // Success handler
}, function() {
    // Error handler
}).always(function() {
    // Always execute this on both error and success
});

2

যারা কৌণিক জেএস ব্যবহার করেন না, এবং যদি আপনি ত্রুটিটি ধরার বিষয়ে ঠিক থাকেন (নিশ্চিত না হন তবে .ফাইনালি () এটি করবে) তবে ডুপ্লিকেট কোডটি এড়াতে আপনি .ক্যাচ () ব্যবহার করতে পারেন (

Promise.resolve()
  .catch(() => {})
  .then(() => console.log('finally'));

ক্যাচ () লগিং বা অন্যান্য ক্লিনআপের জন্য যাইহোক কার্যকর হতে পারে। https://jsfiddle.net/Pointzerotwo/k4rb41a7/


1

আমি পৃষ্ঠাটির বিষয়বস্তু রেন্ডার করতে এনজিভিউ ব্যবহার করব এবং ইভেন্টে ভিডকন্টেন্টলয়েডে আপনাকে মোডাল অপসারণের ট্রিগার করব। Event ইভেন্টটির জন্য http://docs.angularjs.org/api/ng.directive:ng দেখুন এবং ইভেন্ট শ্রোতার উপর for এর জন্য http://docs.angularjs.org/api/ng $ rootScope.Scope দেখুন।

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