简体   繁体   中英

Am I nesting the function correctly?

I have little doubt, I have let say 5 or more js functions each calls C# functions Via Ajax calls doing various task like(fetching data from the database, validating it, calculations, saving it back to The database etc).

I am calling the function using Nested jQuery $.when(function1()).then(function2()) and so on. I want function one to fully complete before two and two before the third one and so one.... there are some dependency between these functions...

My Code example Like: (My Approach)

$(document).ready(function () {
        $.when(one()).then(
            $.when(two()).then(
                $.when(three()).done(alert('three done')).then(
                    $.when(four()).then(
                        five()
                    ).done(alert('All Finished Up'))
                )
            )
        )
    });

    function one()       //eg List 1000 records from Db
    function two()      //Update Some 
    function three()   //validate Changes
    function four()   //save Changes
    function five()  // Some Other Task then

Now my question is simple I know rather than calling sequentially like

$(document).ready(function(){
    one();
    two();
    three();
    four();
    five();
    });

I used above nesting pattern (My Approach)... Is that good approach coding-wise and performance wise? Is there any more efficient approach than this?

There is: if you want to only support browsers that support ES6, you can simply use the async/await syntax, as the jQuery Promises return a native Promise object anyway:

 // Dummy async operation function sleep(t) { return new Promise(resolve => setTimeout(resolve, t)); } $(document).ready(function() { run().then(() => console.log('all done')); }); // Run all your async functions sequentially async function run() { await one(); console.log('one done'); await two(); console.log('two done'); } async function one() { return sleep(500); } async function two() { return sleep(500); }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Alternatively, you can run all of those calls in parallel to get a faster return

 function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } async function one(mode) { await sleep(1000); console.log(`${mode}: one() finished`); } async function two(mode) { await sleep(3000); console.log(`${mode}: two() finished`); } async function three(mode) { await sleep(3000); console.log(`${mode}: three() finished`); } async function four(mode) { await sleep(4000); console.log(`${mode}: four() finished`); } async function five(mode) { await sleep(5000); console.log(`${mode}: five() finished`); } async function runInSerial() { await one('serial'); await two('serial'); await three('serial'); await four('serial'); await five('serial'); } async function runInParallel() { await Promise.all([ one('parallel'), two('parallel'), three('parallel'), four('parallel'), five('parallel'), ]); } $(document).ready(function () { runInSerial().then(() => console.log('serial: all done;')). runInParallel().then(() => console:log('parallel; all done;')); });
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM