AngularJS - একাধিক সংস্থান অনুসন্ধান শেষ হওয়ার জন্য অপেক্ষা করুন to


105

আমি এনজিআরসোর্স দিয়ে সংজ্ঞায়িত একটি ফ্যাক্টরি আছে:

App.factory('Account', function($resource) {
    return $resource('url', {}, {
        query: { method: 'GET' }
    });
});

আমি এই কারখানায় সংজ্ঞায়িত ক্যোয়ারী পদ্ধতিতে একাধিক কল করছি। কলগুলি অবিচ্ছিন্নভাবে ঘটতে পারে, তবে চালিয়ে যাওয়ার আগে উভয় কল সম্পূর্ণ হওয়ার জন্য আমাকে অপেক্ষা করতে হবে:

App.controller('AccountsCtrl', function ($scope, Account) {
    $scope.loadAccounts = function () {
        var billingAccounts = Account.query({ type: 'billing' });
        var shippingAccounts = Account.query({ type: 'shipping' });

        // wait for both calls to complete before returning
    };
});

এনজিআরএসসোর্স দ্বারা নির্ধারিত অ্যাঙ্গুলারজেএস ফ্যাক্টরিগুলির সাথে এটি করার কোনও উপায় আছে, jQuery এর hen .When ()। তারপর () কার্যকারিতার অনুরূপ? আমি আমার বর্তমান প্রকল্পে jQuery যুক্ত না করা পছন্দ করব।

উত্তর:


200

আপনি প্রতিশ্রুতি এবং $ q.all () ব্যবহার করতে চাইবেন

মূলত, আপনি এটি আপনার সমস্ত $ উত্স বা $ HTTP কলগুলিকে মোড়ানোর জন্য ব্যবহার করতে পারেন কারণ তারা প্রতিশ্রুতি ফেরায়।

function doQuery(type) {
   var d = $q.defer();
   var result = Account.query({ type: type }, function() {
        d.resolve(result);
   });
   return d.promise;
}

$q.all([
   doQuery('billing'),
   doQuery('shipping')
]).then(function(data) {
   var billingAccounts = data[0];
   var shippingAccounts = data[1];

   //TODO: something...
});

17
সংস্থানগুলি প্রতিশ্রুতি দেয় না, তারা ভবিষ্যতে ভরাট বস্তুগুলি ফেরত দেয়। তবে অস্থির 1.1.3 সংস্করণে, সংস্থানগুলিরও $thenসম্পত্তি রয়েছে তবে কোনও প্রতিশ্রুতি অবজেক্টটি প্রকাশ করা হয় না। দেশবাসীর কাছে মুখোশ উম্মোচন $promiseসম্পূর্ণরূপে 1.1.4 হবে
Umur Kontacı

@ উমুরকন্টাকı দুর্ভাগ্যক্রমে এটি কৌণিক 1.1.4 এ নয় !
এনএইচ 2

সম্পর্কিত বিশদ বিবরণ সম্পদ না প্রতিশ্রুতি সমস্যা হয় খুঁজে পাওয়া যেতে পারে এই থ্রেড এবং এই টান অনুরোধ
এনএইচ 2

1
এই উত্তরটি কার্যকর হয় একবার এটি কীভাবে লিখতে হয় তা দেখায়।
এনএইচ 2

3
আপনার উত্তরটি খুব সহায়ক এবং আমি বিশ্বাস করি এটি বর্তমান কৌণিকের প্রতিশ্রুতিতে সংস্থানগুলিকে রূপান্তরিত করার সবচেয়ে বুদ্ধিমান উপায়। এটি যুক্ত করতে সহায়ক হতে পারে যে ডকুমেন্টেশনে $q, আপনি যেটির সাথে লিঙ্ক করেছেন, এটি গ্যারান্টি দেয় যে ফলাফল অ্যারে প্রতিশ্রুতি অ্যারের মতো একই ক্রমে রয়েছে।
এনএইচ

20

আমি মনে করি এর থেকে ভাল সমাধান হ'ল:

$q.all([
   Account.query({ type: 'billing' }).$promise,
   Account.query({ type: 'shipping' }).$promise
]).then(function(data) {
   var billingAccounts = data[0];
   var shippingAccounts = data[1];

   //TODO: something...
});

1
আমার জন্য $ প্রতিশ্রুতি না দিয়ে শেষ পর্যন্ত ... ঠিক যেমন: অ্যাকাউন্ট.কোয়ারি ({প্রকার: 'বিলিং'}), অ্যাকাউন্ট.কোয়ারী ({প্রকার: 'শিপিং'})
জর্জিয়াস

12

বেন লেশের কাছ থেকে সমাধানটি সেরা তবে এটি সম্পূর্ণ নয়। আপনার যদি ত্রুটির শর্তগুলি হ্যান্ডেল করার দরকার হয় - এবং, হ্যাঁ, আপনি করেন - তবে আপনাকে অবশ্যই catchপ্রতিশ্রুতি API এ পদ্ধতিটি ব্যবহার করতে হবে :

$q.all([
   doQuery('billing'),
   doQuery('shipping')
]).then(function(data) {
   var billingAccounts = data[0];
   var shippingAccounts = data[1];

   //TODO: something...

}).catch(function(data) {

   //TODO: handle the error conditions...

}).finally(function () {

  //TODO: do final clean up work, etc...

});

আপনি যদি সংজ্ঞা না দিয়ে থাকেন catchএবং আপনার সমস্ত প্রতিশ্রুতি ব্যর্থ হয়, তবে thenপদ্ধতিটি কখনই কার্যকর হবে না এবং সম্ভবত আপনার ইন্টারফেসটি খারাপ অবস্থায় ফেলে দেবে।

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