Execute function queue in javascript

后端 未结 6 679
误落风尘
误落风尘 2020-12-01 19:35

I\'m trying to create a function queue with several functions in it. After the creation i want to execute each function in it\'s turn. But these function have delayed instru

6条回答
  •  春和景丽
    2020-12-01 20:18

    Try utilizing .queue() , .promise() ; see also Change easing functions on animations in jQuery queue

    function fun1() {
      return $.Deferred(function(dfd) {
        setTimeout(function() {
          dfd.resolve(1)
        }, 1500)
      }).promise().then(msg)
    }
    
    function fun2() {
      return $.Deferred(function(dfd) {
        setTimeout(function() {
          dfd.resolve(2)
        }, 1500)
      }).promise().then(msg)
    }
    
    function fun3() {
      return $.Deferred(function(dfd) {
        setTimeout(function() {
          dfd.resolve(3)
        }, 1500)
      }).promise().then(msg)
    }
    
    var funqueue = [];
    funqueue.push(function() {
      return fun1()
    });
    funqueue.push(function() {
      return fun2()
    });
    funqueue.push(function() {
      return fun3()
    });
    
    function msg(data) {
       if (data === "complete") console.log(data)
       else $("body").append(data + "
    ") } function executeFunctionQueue(funqueue) { var deferred = funqueue.pop(); return deferred().then(function() { // set `this` within `$.queue()` , `.then()` to empty object `{}`, // or other object return $({}).queue("fun", $.map(funqueue, function(fn) { return function(next) { // return `next` function in `"fun"` queue return fn().then(next) } })).dequeue("fun").promise("fun") .then(function() { // return "complete" string when `fun` queue empty return "complete" }) }); } executeFunctionQueue(funqueue) .then(msg);


    Alternatively , using $.when()

    function executeFunctionQueue(funqueue) {
      return $.when(!!funqueue[funqueue.length - 1] 
                    ? funqueue.pop().call().then(function() {
                      return executeFunctionQueue(funqueue)}) 
                    : "complete")
    }
    
    executeFunctionQueue(funqueue)
    .then(function(complete) { 
      console.log(complete) 
    });
    

    function fun1() {
      return $.Deferred(function(dfd) {
        setTimeout(function() {
          dfd.resolve(1)
        }, 1500)
      }).promise().then(msg)
    }
    
    function fun2() {
      return $.Deferred(function(dfd) {
        setTimeout(function() {
          dfd.resolve(2)
        }, 1500)
      }).promise().then(msg)
    }
    
    function fun3() {
      return $.Deferred(function(dfd) {
        setTimeout(function() {
          dfd.resolve(3)
        }, 1500)
      }).promise().then(msg)
    }
    
    var funqueue = [];
    funqueue.push(function() {
      return fun1()
    });
    funqueue.push(function() {
      return fun2()
    });
    funqueue.push(function() {
      return fun3()
    });
    
    function msg(data) {
      if (data === "complete") console.log(data)
      else $("body").append(data + "
    ") } function executeFunctionQueue(funqueue) { return $.when(!!funqueue[funqueue.length - 1] ? funqueue.pop().call().then(function() { return executeFunctionQueue(funqueue)}) : "complete") } executeFunctionQueue(funqueue) .then(msg);

提交回复
热议问题