简体   繁体   中英

Excecute JavaScript function after previous one completes

I want to execute several JavaScript functions in a specific order (like below) and not until the previous function has completed. I have tried this so many ways. Any suggestions? Any help is so greatly appreciated, I have been stuck on this for so long. Thanks in advance!

function savedSearch(e){
       applySearch1("ColumnA");
       applySearch2("ColumnB");
       applySearch3("ColumnC");
       applySearch4("ColumnD");
       applySearch5("ColumnE");
       applySearch6("ColumnF");
}

To add in response to the other answer by Mohkhan, you can also use the async library.

https://github.com/caolan/async

That will keep you out of callback hell and make for a much easier to read list of functions.

You should use callbacks in all your applySearch* functions. Like this.

function savedSearch(e){
   applySearch1("ColumnA", function(){
       applySearch2("ColumnB", function(){
           applySearch3("ColumnC", function(){
               applySearch4("ColumnD", function(){
                   applySearch5("ColumnE",function(){
                       applySearch6("ColumnF", function(){
                           // You are done
                       });
                   });
               });
           });
       });
   });
}

If use jquery, it has deferred objects which helps you deal with async functions.

Here is an example:

 // Code goes here $(document).ready(function() { function Pipe() { this.asyncTasks = []; this.observers = {}; this.on = function(eventName, fn) { if (!this.observers[eventName]) { this.observers[eventName] = $.Callbacks; } this.observers[eventName].add(fn); } this.fire = function(eventName, data) { if (this.observers[eventName]) { this.observers[eventName].fire(data); } } this.register = function(asyncFn, context) { this.asyncTasks.push(new Task(asyncFn, context)); } this.start = function() { this.fire('start'); this._next(); } this._next = function() { var task = this.asyncTasks.shift(); if (task) { task.execute().then($.proxy(this._next, this)); } else { this.fire('end'); } } var Task = function(fn, context) { this.fn = fn; this.context = context; this.execute = function() { if (!this.fn) { throw new Exception("Failed to execute."); } var promise = this.fn.call(context); this.fn = null; return promise; } } } var bookMoview = function() { var dfd = jQuery.Deferred(); // Resolve after a random interval setTimeout(function() { dfd.resolve("The movie is booked"); console.log("The movie is booked"); }, Math.floor(400 + Math.random() * 2000)); // Return the Promise so caller can't change the Deferred return dfd.promise(); } var bookTaxi = function() { var dfd = jQuery.Deferred(); // Resolve after a random interval setTimeout(function() { console.log("Taxi is booked"); dfd.resolve("Taxi is booked"); }, Math.floor(400 + Math.random() * 2000)); // Return the Promise so caller can't change the Deferred return dfd.promise(); } var pipe = new Pipe(); pipe.register(bookMoview); pipe.register(bookTaxi); pipe.start(); }); 

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