一个接一个地调用javascript函数

时间:2014-07-02 22:22:13

标签: javascript asynchronous

你能帮忙回答这个问题。请不要约束。

var myLib = {

 var callback_one = function (result_from_web_service) {
   console.log('callback_one'); 
 };

 var callback_one = function (result_from_web_service) {
   console.log('callback_two'); 
 };

 var init = function () {
   console.log('initializing...');
   async_call_one(callback_one);
   async_call_two(callback_two);
 };

 var doStuff = function () {
   console.log('doStuff is called');
 };

};

// User of my library
myLib.init();
myLib.doStuff();

// output
initializing...
doStuff is called
callback_one
callback_two

// What i need:
initializing...
callback_one
callback_two
doStuff is called

约束:

  1. 调用myLib.init不会最终调用myLib.doStuff。即myLib.init应独立于myLib.doStuff
  2. 应该在myLib.init()之后调用
  3. myLib.doStuff()并返回其回调。
  4. 谢谢,

2 个答案:

答案 0 :(得分:1)

//You must change your API so init is async
//There is no way to have it wait until all initialization is done before it retuns
var init = function (initDone) { 
   console.log('initializing...');

   var n = 0;
   function serviceDone(){
      n++;
      if(n >= 2){ initDone() }
   }

   async_call_one(function(x){ callback_one(x); serviceDone() });
   async_call_two(function(x){ callback_two(x); serviceDone() });
};

// User of my library
myLib.init(function(){
  myLib.doStuff();
})

我并行化这些调用的方式是非常特别的,而不是最易维护的(我需要保持对serviceDone的调用和N的值同步)。从长远来看,我建议使用其中一个那里有很多JS异步编程库。

答案 1 :(得分:0)

hugomg有一个很好的答案。

然而,我认为这是非常具体的,可能有益于某种工作流程实现,就像这样(大约......):

function void() {}

var myLib = {

    var g_flow = [];

    g_flow[this.init] = [];
    g_flow[this.init]["whendone"] = this.callback_one;
    g_flow[this.init]["done"] = false;

    g_flow[this.callback_one] = [];
    g_flow[this.callback_one]["whendone"] = this.callback_two;
    g_flow[this.callback_one]["done"] = false;

    g_flow[this.callback_two] = [];
    g_flow[this.callback_two]["whendone"] = this.doStuff;
    g_flow[this.callback_two]["done"] = false;

    g_flow[this.doStuff] = [];
    g_flow[this.doStuff]["whendone"] = void;
    g_flow[this.doStuff]["done"] = false;

    var callback_one = function (result_from_web_service) {
       console.log('callback_one'); 
    };

    var callback_one = function (result_from_web_service) {
       console.log('callback_two'); 
    };

    var init = function () {
       console.log('initializing...');
    };

    var doStuff = function () {
       console.log('doStuff is called');
    };

    var flow_onward(hwnd) {
        async_call(function(){ hwnd(); myLib.flow_onward(g_flow[hwnd]["whendone"]); });
    }

    flow_onward(this.init);

};

// User of my library
myLib.init();
myLib.doStuff();

这样做可以确保顺序性,并根据需要扩展回调次数。

ps:此代码尚未经过测试