一个接一个地调用javascript函数

call javascript function after another

本文关键字:一个 javascript 函数 调用      更新时间:2023-09-26

你能帮我回答这个问题吗?

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.doStuff()应该在myLib.init()和它的回调函数返回后调用。

谢谢,

//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异步编程库中的一个。

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:此代码未经过测试