SAS20
SAS20

Reputation: 49

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");
}

Upvotes: 0

Views: 80

Answers (3)

jumarov
jumarov

Reputation: 46

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();

});

Upvotes: 0

Scheda
Scheda

Reputation: 526

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.

Upvotes: 2

mohkhan
mohkhan

Reputation: 12295

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
                       });
                   });
               });
           });
       });
   });
}

Upvotes: 1

Related Questions