Fer। যখন () এ ডিফার্ডের একটি অ্যারে পাস করুন


447

এখানে কী চলছে তার একটি স্বতন্ত্র উদাহরণ: http://jsfiddle.net/adamjford/YNGcm/20/

এইচটিএমএল:

<a href="#">Click me!</a>
<div></div>

javascript:

function getSomeDeferredStuff() {
    var deferreds = [];

    var i = 1;
    for (i = 1; i <= 10; i++) {
        var count = i;

        deferreds.push(
        $.post('/echo/html/', {
            html: "<p>Task #" + count + " complete.",
            delay: count
        }).success(function(data) {
            $("div").append(data);
        }));
    }

    return deferreds;
}

$(function() {
    $("a").click(function() {
        var deferreds = getSomeDeferredStuff();

        $.when(deferreds).done(function() {
            $("div").append("<p>All done!</p>");
        });
    });
});

আমি চাই "সব শেষ!" স্থগিত করা সমস্ত কাজ সমাপ্ত হওয়ার পরে উপস্থিত হতে পারে, তবে $.when()ডিফার্ড অবজেক্টের অ্যারে কীভাবে পরিচালনা করতে হয় তা জানা যায় না। "সব শেষ!" প্রথমে ঘটছে কারণ অ্যারেটি একটি ডিফার্ড অবজেক্ট নয়, তাই jQuery এগিয়ে যায় এবং ধরে নেওয়া যায় যে এটি সবেমাত্র সম্পন্ন হয়েছে।

আমি জানি যে কেউ বস্তুগুলি যেমন ফাংশনে পাস করতে পারে $.when(deferred1, deferred2, ..., deferredX)তবে এটি অজানা যে আমি যে সমস্যার সমাধান করতে চাইছি সেখানে কতটি ডিফার্ড অবজেক্ট কার্যকর হবে।



নীচে এই খুব পুরানো প্রশ্নের জন্য একটি নতুন, সহজ, উত্তর যুক্ত করেছেন। আপনাকে যা না একটি অ্যারের ব্যবহার করতে হবে বা $.when.applyসব সময়ে একই ফলাফল পেতে।
কোডিং চলে গেছে

প্রশ্নটির বিষয়টিকে পিছনে ফেলে দেওয়া হয়েছে, কারণ এটি অত্যন্ত নির্দিষ্ট ছিল (এটি কেবল একটি এজেএক্স সমস্যা নয়)
অল

উত্তর:


732

থেকে মূল্যবোধের একটি অ্যারের প্রেরণ করার জন্য কোনো ফাংশন যা স্বাভাবিকভাবে তাদের পৃথক পরামিতি, ব্যবহার হতে আশা Function.prototype.apply, তাই এই ক্ষেত্রে আপনি প্রয়োজন:

$.when.apply($, my_array).then( ___ );

Http://jsfiddle.net/YNGcm/21/ দেখুন

ES6 এ, আপনি এর পরিবর্তে ... স্প্রেড অপারেটরটি ব্যবহার করতে পারেন :

$.when(...my_array).then( ___ );

উভয় ক্ষেত্রেই, .thenহ্যান্ডলারের কতগুলি ফর্মাল প্যারামিটারের প্রয়োজন হবে তা আপনি আগেই argumentsজানতে পারবেন যেহেতু প্রতিটি প্রতিশ্রুতির ফলাফল পুনরুদ্ধার করতে সেই হ্যান্ডলারের অ্যারে প্রক্রিয়াজাত করতে হবে ।


4
এটি দুর্দান্ত কাজ করে। :) আমি অবাক হয়েছি আমি গুগলের মাধ্যমে এত সাধারণ পরিবর্তন ড্রেজ করতে সক্ষম হইনি!
অ্যাডামজফোর্ড

9
যে কারণ এটি একটি জেনেরিক পদ্ধতি, না নির্দিষ্ট $.when- f.apply(ctx, my_array)ডাকব fসঙ্গে this == ctxএবং আর্গুমেন্ট সেট বিষয়বস্তু এর my_array
Alnitak

4
@ অ্যালনিটাক: আমি একটু বিব্রত বোধ করছি যে আমি জাভাস্ক্রিপ্টটি কতক্ষণ লিখছি তা বিবেচনা করে আমি সেই পদ্ধতি সম্পর্কে জানিনা!
অ্যাডামজফোর্ড

5
এফডব্লিউআইডাব্লিউ , প্রথম প্যারামিটার হিসাবে $বনাম পাস করার আলোচনার সাথে একটি এলার প্রশ্নের উত্তরটির লিঙ্কটি nullপড়ার মতো। যদিও এই বিশেষ ক্ষেত্রে এটি কিছু যায় আসে না।
Alnitak

4
@ অলনিটক: হ্যাঁ, তবে এর $চেয়ে কম টাইপ করা হচ্ছে nullএবং $.whenবাস্তবায়ন পরিবর্তিত হলে আপনি নিরাপদ থাকবেন (এটি সম্ভবত এই ক্ষেত্রে হয় না তবে কেন thisডিফল্টরূপে অপরিবর্তিত রাখবেন না )।
টমাসজ জিলিয়াস্কি

109

উপরের কাজের ক্ষেত্রগুলি (ধন্যবাদ!) স্থগিতের resolve()পদ্ধতিতে প্রদত্ত বস্তুগুলি ফিরিয়ে আনার সমস্যাটিকে যথাযথভাবে সমাধান করে না কারণ জিকুয়েরি একটি অ্যারে নয়, পৃথক প্যারামিটারগুলির সাথে কল done()এবং fail()কলব্যাকগুলি কল করে । তার মানে হল যে argumentsসিফরও-অ্যারে ডিফার্ডের অ্যারে দ্বারা ফিরিয়ে নেওয়া সমস্ত সমাধান করা / প্রত্যাখ্যানিত অবজেক্টগুলি পেতে আমাদের ছদ্ম-অ্যারে ব্যবহার করতে হবে:

$.when.apply($,deferreds).then(function() {
     var objects=arguments; // The array of resolved objects as a pseudo-array
     ...
};

যেহেতু আমরা স্থগিতের একটি অ্যারে পেরিয়েছি, ফলাফলের অ্যারে ফিরে পাওয়া ভাল লাগবে। সিউডো-অ্যারের পরিবর্তে একটি প্রকৃত অ্যারে ফিরে পাওয়া ভাল লাগবে যাতে আমরা এর মতো পদ্ধতি ব্যবহার করতে পারিArray.sort()

এখানে.জেএস এর when.all()পদ্ধতি দ্বারা অনুপ্রাণিত একটি সমাধান যা এই সমস্যার সমাধান করে:

// Put somewhere in your scripting environment
if (typeof jQuery.when.all === 'undefined') {
    jQuery.when.all = function (deferreds) {
        return $.Deferred(function (def) {
            $.when.apply(jQuery, deferreds).then(
                function () {
                    def.resolveWith(this, [Array.prototype.slice.call(arguments)]);
                },
                function () {
                    def.rejectWith(this, [Array.prototype.slice.call(arguments)]);
                });
        });
    }
}

এখন আপনি কেবল স্থগিত / প্রতিশ্রুতিগুলির একটি অ্যারে পাস করতে পারেন এবং আপনার কলব্যাকে সমাধান / প্রত্যাখ্যাত বস্তুর একটি অ্যারে ফিরে পেতে পারেন:

$.when.all(deferreds).then(function(objects) {
    console.log("Resolved objects:", objects);
});

6
আপনি সমাধানটি এবং প্রত্যাখ্যানের সাথে ব্যবহার করতে চাইতে পারেন ঠিক যেমন আপনি 'এই' ডিফার্ডড্রাইসড্রাইভ উইথ (এটি, [অ্যারে.প্রোটোটাইপ.স্লাইস.call (আর্গুমেন্ট)]) ইত্যাদি হিসাবে একই মূল ডিফার্ড পেতে পারেন
জেমি প্যাট

1
আপনার কোডে কেবল একটি ছোট সমস্যা আছে, যখন অ্যারেতে কেবলমাত্র একটি উপাদান থাকে ফলাফল ফলাফলগুলি অ্যারের পরিবর্তে কেবলমাত্র একটি ফলাফলের সাথে অ্যারের পরিবর্তে ফলাফল দেয় (যা একটি অ্যারের প্রত্যাশা করে এমন কোডটি ভেঙে দেবে)। এটি ঠিক করতে, var toArray = function (args) { return deferreds.length > 1 ? $.makeArray(args) : [args]; }পরিবর্তে এই ফাংশনটি ব্যবহার করুন Array.prototype.slice.call
লুয়ান নিকো

হুঁ, এটি 404 এর কোনও ধরা পড়বে না।
t.mikael.d

কারণটি খুঁজে পেয়েছে, .fail এর পরিবর্তে .reject হওয়া উচিত - যাতে এটি 404 টি ধরা যায়।
t.mikael.d

38

আপনি whenপদ্ধতিটি আপনার অ্যারেতে প্রয়োগ করতে পারেন :

var arr = [ /* Deferred objects */ ];

$.when.apply($, arr);

আপনি কীভাবে jQuery ডিফার্ডস এর অ্যারে দিয়ে কাজ করবেন?


আমি আসলে এই প্রশ্নটি দেখেছি তবে অনুমান করি যে এই প্রশ্নের অতিরিক্ত সমস্ত বিবরণ আমার সমস্যার উত্তর (যা সেখানে ছিল) আমার মাথার উপর দিয়ে উড়ে গেছে।
অ্যাডামজফোর্ড

1
@ অ্যাডমজফোর্ড, যদি এটি আপনাকে আরও ভাল বোধ করে তবে আমি আপনার প্রশ্নটি গ্রাস করতে সহজ পেয়েছি (এবং এই সঠিক সমস্যার জন্য আমার বিশেষ গুগল অনুসন্ধানে প্রথম)।
পৃষ্ঠপোষক

@ পাটারিজ: শুনে আপনি খুশী হলেন!
অ্যাডামজফোর্ড

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

7

একাধিক সমান্তরাল এজেএক্স কল করার সময়, আপনার কাছে সম্পর্কিত প্রতিক্রিয়াগুলি পরিচালনা করার জন্য দুটি বিকল্প রয়েছে have

  1. সিঙ্ক্রোনাস এজেএক্স কল / একের পর এক / প্রস্তাবিত নয়
  2. Promises'অ্যারে ব্যবহার করুন এবং $.whenযা promiseএস গ্রহণ করে এবং এর কলব্যাক কল .doneহয়ে যায় যখন সমস্ত promiseগুলি সাফল্যের সাথে স্বতন্ত্র প্রতিক্রিয়া সহ ফিরে আসে।

উদাহরণ

function ajaxRequest(capitalCity) {
   return $.ajax({
        url: 'https://restcountries.eu/rest/v1/capital/'+capitalCity,
        success: function(response) {
        },
        error: function(response) {
          console.log("Error")
        }
    });
}
$(function(){
   var capitalCities = ['Delhi', 'Beijing', 'Washington', 'Tokyo', 'London'];
   $('#capitals').text(capitalCities);

   function getCountryCapitals(){ //do multiple parallel ajax requests
      var promises = [];   
      for(var i=0,l=capitalCities.length; i<l; i++){
            var promise = ajaxRequest(capitalCities[i]);
            promises.push(promise);
      }
  
      $.when.apply($, promises)
        .done(fillCountryCapitals);
   }
  
   function fillCountryCapitals(){
        var countries = [];
        var responses = arguments;
        for(i in responses){
            console.dir(responses[i]);
            countries.push(responses[i][0][0].nativeName)
        }  
        $('#countries').text(countries);
   }
  
   getCountryCapitals()
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
  <h4>Capital Cities : </h4> <span id="capitals"></span>
  <h4>Respective Country's Native Names : </h4> <span id="countries"></span>
</div>


1
আপনার উত্তরটি ছাপিয়ে গেছে, এবং তাই প্রশ্নের শিরোনামে আপনার সম্পাদনাটি করেছে। ওজে ইতিমধ্যে জানে কীভাবে এজেএক্স কল করা যায় এবং মুলতুবি বস্তুর একটি অ্যারে পাওয়া যায়। একমাত্র প্রশ্ন বিন্দু কিভাবে যে অ্যারের পাস ছিল $.when
Alnitak

5
আমি ভেবেছিলাম উদাহরণের সাথে বিস্তারিত ব্যাখ্যা করা সহজলভ্য বিকল্পগুলির সাথে আরও ভাল হবে and এবং এর জন্য আমি ভাবি না যে ডাউনভোটটি প্রয়োজনীয় ছিল।
বিনায়াকজ

2
ডাউনটোটটি ছিল ১ টির জন্য। এমনকি সিঙ্কের পরামর্শও দেওয়া হয়েছে (যদিও তা না করার প্রস্তাব দেওয়া হচ্ছে) 2. উদাহরণগুলিতে নিম্ন মানের মানের কোড ( for ... inএকটি অ্যারে সহ ?!)
অ্যালনিটাক

1
1. সম্মত হয়েছে, 2. হওয়া উচিত ছিল না (not recommended)- for ... inঠিক আছে কারণ অ্যারেটিতে কেবলমাত্র সেই বৈশিষ্ট্য রয়েছে যা (অতিরিক্ত সম্পত্তি নেই) থাকে।
থেঙ্কস

1
পুনরায়: 2 - সমস্যাটি হ'ল এটি অন্য লোকদের দ্বারা অনুলিপি করা হতে পারে যারা এই গ্যারান্টিটি দিতে পারে না, বা যুক্ত করতে যথেষ্ট বোকা হয়েছে Array.prototype। যে কোনও ইভেন্টে, অ-পারফরম্যান্স-সমালোচনামূলক কোডের জন্য / লুপের .mapপরিবর্তে ব্যবহার করা ভাল would উদাহরণস্বরূপ - কাজ শেষ। forpushvar promises = capitalCities.map(ajaxRequest); $.when.apply($, promises).then(fillCountryCapitals)
Alnitak

6

একটি সহজ বিকল্প হিসাবে, এর প্রয়োজন হয় না $.when.applyবা একটি array, আপনি একাধিক সমান্তরাল প্রতিশ্রুতিগুলির জন্য একক প্রতিশ্রুতি উত্পন্ন করতে নিম্নলিখিত প্যাটার্নটি ব্যবহার করতে পারেন:

promise = $.when(promise, anotherPromise);

যেমন

function GetSomeDeferredStuff() {
    // Start with an empty resolved promise (or undefined does the same!)
    var promise;
    var i = 1;
    for (i = 1; i <= 5; i++) {
        var count = i;

        promise = $.when(promise,
        $.ajax({
            type: "POST",
            url: '/echo/html/',
            data: {
                html: "<p>Task #" + count + " complete.",
                delay: count / 2
            },
            success: function (data) {
                $("div").append(data);
            }
        }));
    }
    return promise;
}

$(function () {
    $("a").click(function () {
        var promise = GetSomeDeferredStuff();
        promise.then(function () {
            $("div").append("<p>All done!</p>");
        });
    });
});

মন্তব্য:

  • কারও শৃঙ্খলাবদ্ধ প্রতিশ্রুতি ব্যবহার করে দেখার পরে আমি এটিকে আবিষ্কার করেছি promise = promise.then(newpromise)
  • খারাপ দিকটি হ'ল এটি পর্দার আড়ালে অতিরিক্ত প্রতিশ্রুতিযুক্ত অবজেক্ট তৈরি করে এবং শেষে যে কোনও প্যারামিটারগুলি খুব কার্যকর হয় না (কারণ তারা অতিরিক্ত বস্তুর অভ্যন্তরে বাসা বাঁধে)। এটি আপনি যা চান তা যদিও এটি সংক্ষিপ্ত এবং সহজ।
  • উলটোটি এটির জন্য কোনও অ্যারে বা অ্যারে পরিচালনার প্রয়োজন নেই।

2
আমি ভুল হলে আমাকে সংশোধন করুন তবে আপনার পদ্ধতির কার্যকরভাবে বাসা বাঁধছে $। যখন ($। যখন ($। যখন (...))) তখন আপনি পুনরাবৃত্তভাবে নেস্ট করেছেন 10 স্তরগুলি গভীর যদি 10 টি পুনরাবৃত্তি হয়। এটি খুব সমান্তরাল বলে মনে হচ্ছে না কারণ আপনার নিজের প্রতিশ্রুতি ফিরে আসার আগে আপনি প্রতিটি স্তরের জন্য বাসা বাঁধার প্রতিশ্রুতি ফিরে পেতে অপেক্ষা করতে হবে - আমি মনে করি গৃহীত উত্তরের মধ্যে অ্যারে অ্যাপ্রোচটি অনেক পরিচ্ছন্ন কারণ এটি এতে নির্মিত নমনীয় প্যারামিটার আচরণটি ব্যবহার করে $। যখন () পদ্ধতি।
অ্যান্টনি ম্যাকলিন

@ অ্যান্টনিম্যাকলিন: এটি কোডিংয়ের সহজ বিকল্প সরবরাহ করার উদ্দেশ্যে, আরও ভাল পারফরম্যান্স নয় (যা বেশিরভাগ অ্যাসিঙ্ক কোডিংয়ের সাথে উপেক্ষিত নয়), then()একইভাবে কল চেইনের সাথে করা হয় । এর সাথে আচরণটি $.whenসমান্তরাল (বেঁধে রাখা নয়) হিসাবে কাজ করা। এটি কার্যকর হিসাবে কার্যকর বিকল্প ফেলে দেওয়ার আগে এটি চেষ্টা করুন :)
কোডিং হয়ে গেছে

2
@ অ্যালনিটাক: কোর্সের জন্য ঘোড়া। আপনি অবশ্যই মতামতের অধিকারী, তবে আপনি অবশ্যই এটি ব্যবহার করেন নি। আমার নিজস্ব মতামত এই কৌশলটির ব্যবহারিক ব্যবহারের উপর ভিত্তি করে। এটি কাজ করে এবং এর ব্যবহার রয়েছে, সুতরাং কেন "লোকেদের বোঝা" (একটি) এবং "কিছুই সলভ করে না" (যেমন সত্য নয় - যেমন অ্যার প্রসেসিংটি সরিয়ে দেয় এবং সমান্তরাল প্রতিশ্রুতিগুলির শৃঙ্খলা সহজ করে যেখানে প্রত্যাবর্তনকে সরল করে তোলে) মানগুলির প্রয়োজন হয় না, যা আপনার জানা উচিত যে প্যারালাল প্রসেসিং ক্ষেত্রে খুব কমই ব্যবহৃত হয়)। ডাউনভোটগুলি "এই উত্তরটি কার্যকর নয়" এর জন্য বলে মনে করা হয় :) :)
কোডিং 06

1
হাই @ গনকোডিং আমি কি আপনাকে জিজ্ঞাসা করতে পারি যে আপনি আপনার উত্তরগুলিতে ভোটের মন্তব্যটি যুক্ত করবেন না? এটি মন্তব্যের জন্য উপযুক্ত, তবে অন্যথায় এটি এমন শব্দ যা অন্যথায় ভাল সামগ্রী থেকে দূরে সরে যায়। ধন্যবাদ।
অর্ধেক

1
@ হালফার: আমি আর কোনও পোস্ট করি না তবে মূল কিছুতে প্রদর্শিত অজ্ঞতায় আমি বিরক্ত হয়েছি। আজকাল আমার কাছে সমস্ত নতুন ধারণা রাখছি :)
কোডিং

4

আমি $ .Ech ব্যবহার করে অন্যকে প্রস্তাব দিতে চাই:

  1. আমরা এজ্যাক্স ফাংশনটি এই জাতীয়ভাবে ঘোষণা করতে পারি:

    function ajaxFn(someData) {
        this.someData = someData;
        var that = this;
        return function () {
            var promise = $.Deferred();
            $.ajax({
                method: "POST",
                url: "url",
                data: that.someData,
                success: function(data) {
                    promise.resolve(data);
                },
                error: function(data) {
                    promise.reject(data);
                }
            })
            return promise;
        }
    }
  2. কোডের অংশ যেখানে আমরা প্রেরণের জন্য অজ্যাক্স সহ ফাংশনগুলির অ্যারে তৈরি করি:

    var arrayOfFn = [];
    for (var i = 0; i < someDataArray.length; i++) {
        var ajaxFnForArray = new ajaxFn(someDataArray[i]);
        arrayOfFn.push(ajaxFnForArray);
    }
  3. এবং আজাক্স প্রেরণ সহ ফাংশন কলিং:

    $.when(
        $.each(arrayOfFn, function(index, value) {
            value.call()
        })
    ).then(function() {
            alert("Cheer!");
        }
    )

1

আপনি যদি স্থানান্তরিত হয়ে থাকেন এবং ES6 এ অ্যাক্সেস পেয়ে থাকেন তবে আপনি স্প্রেড সিনট্যাক্স ব্যবহার করতে পারেন যা কোনও অবজেক্টের প্রতিটি পুনরাবৃত্ত আইটেমকে একটি বিযুক্ত যুক্তি হিসাবে নির্দিষ্টভাবে প্রযোজ্য $.when()

$.when(...deferreds).done(() => {
    // do stuff
});

এমডিএন লিংক - স্প্রেড সিনট্যাক্স


0

আপনি যদি কৌনিক জেএস বা কিউ প্রতিশ্রুতি গ্রন্থাগারের কিছু বৈকল্পিক ব্যবহার করছেন তবে আপনার কাছে এমন একটি .all()পদ্ধতি রয়েছে যা এই সঠিক সমস্যাটি সমাধান করে।

var savePromises = [];
angular.forEach(models, function(model){
  savePromises.push(
    model.saveToServer()
  )
});

$q.all(savePromises).then(
  function success(results){...},
  function failed(results){...}
);

সম্পূর্ণ এপিআই দেখুন:

https://github.com/kriskowal/q/wiki/API-Reference#promiseall

https://docs.angularjs.org/api/ng/service/$q


4
এটি সম্পূর্ণ অপ্রাসঙ্গিক।
বেনিয়ামিন গ্রুইনবাউম

@ বেঞ্জামিনগ্রুয়েনবাউম কীভাবে? সমস্ত জাভাস্ক্রিপ্ট প্রতিশ্রুতি পাঠাগারগুলি একটি অনুরূপ এপিআই ভাগ করে দেয় এবং বিভিন্ন বাস্তবায়ন দেখানোর ক্ষেত্রে কোনও ভুল নেই। আমি কৌণিকের জন্য উত্তর খুঁজতে এই পৃষ্ঠায় পৌঁছেছি এবং আমি সন্দেহ করি যে আরও অনেক ব্যবহারকারী এই পৃষ্ঠায় পৌঁছে যাবেন এবং অগত্যা কেবল পরিবেশ পরিবেশে আসবেন না।
মাস্তব্লাস্টা

2
যথা, jQuery এর প্রতিশ্রুতি এই এপিআই ভাগ করে না , স্ট্যাক ওভারফ্লো উপর একটি উত্তর হিসাবে এটি সম্পূর্ণ অনুপযুক্ত - অ্যাঙ্গুলার জন্য অনুরূপ উত্তর আছে এবং আপনি সেখানে জিজ্ঞাসা করতে পারেন। (উল্লেখ করার দরকার নেই, আপনার .mapএখানে থাকা উচিত তবে ওহ ভাল)।
বেনিয়ামিন গ্রুইনবাউম

0

আমার খুব অনুরূপ একটি কেস ছিল যেখানে আমি প্রতিটি লুপে পোস্ট করেছিলাম এবং তারপরে এজাক্স থেকে প্রাপ্ত নম্বরগুলি থেকে কিছু ক্ষেত্রে html মার্কআপ সেট করেছিলাম। আমার তখন এই ক্ষেত্রগুলির মোট (বর্তমানে আপডেট হওয়া) মানগুলি এবং মোট ক্ষেত্রের মধ্যে স্থানের প্রয়োজন needed

এইভাবে সমস্যাটি হ'ল আমি সমস্ত সংখ্যার উপর একটি যোগফল করার চেষ্টা করছিলাম তবে অ্যাসিঙ্ক এজ্যাক্স কলগুলি থেকে কোনও তথ্য ফিরে আসেনি। কোডটি পুনরায় ব্যবহার করতে সক্ষম হতে আমার কয়েকটি কার্যক্রমে এই কার্যকারিতাটি শেষ করতে হবে। আমার বাহ্যিক ফাংশনটি ডেটাটির জন্য অপেক্ষা করে আমি তারপরে যাওয়ার আগে এবং সম্পূর্ণ আপডেট হওয়া ডোম দিয়ে কিছু স্টাফ করি।

    // 1st
    function Outer() {
        var deferreds = GetAllData();

        $.when.apply($, deferreds).done(function () {
            // now you can do whatever you want with the updated page
        });
    }

    // 2nd
    function GetAllData() {
        var deferreds = [];
        $('.calculatedField').each(function (data) {
            deferreds.push(GetIndividualData($(this)));
        });
        return deferreds;
    }

    // 3rd
    function GetIndividualData(item) {
        var def = new $.Deferred();
        $.post('@Url.Action("GetData")', function (data) {
            item.html(data.valueFromAjax);
            def.resolve(data);
        });
        return def;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.