如何在事件驱动编程中找到执行结束

问题描述:

这是我的代码。如何在事件驱动编程中找到执行结束

db.query(str, arr, function selectCb(error, results, fields) { 
     if (error) { 
      return proceed(false, {errno:'010',message:error.message}, request); 
     } 
     for (var i=0; i<results.length; i++) { 
      // add the gib infor 
      if (results[i].refertype=='G') { 
       var input={}; 
       input.fields="*"; 
       input.gibname=results[i].refername; 
       gib.getgibinternal(input, makeCallback(i)); 
       function makeCallback(index) { 
        return function(gresult) { 
         results[index].gib=gresult.data[0]; 
         if (index==results.length-1) { 
          // becuase problem was comint in yapi enterothers it give onlye one result of gib 
          return proceed(true, results, request); 
         } 
        } 
       } 
       // add the user info   
      } else if(results[i].refertype=='U') { 
       var input={}; 
       input.username=results[i].refername; 
       input.fields="*"; 
       user.getuserinternal(input, makeCallbackuser(i)); 
       function makeCallbackuser(index) { 
        return function(gresult) { 
         results[index].user=gresult.data[0]; 
         if(index==results.length-1) { 
          return proceed(true, results, request); 
         } 
        } 
       } 
      } 
     } 
     if (results.length==0) { 
      return proceed(true, results, request); 
     } 

    }); 
}); 

在这段代码的问题是,当我有5个记录所有refertype G和5记录refertype的则U此函数返回不等待用户数据来。

假设返回类型G是最后一次,并且用户数据来自服务器迟到,所以当最后一个G到达时,它返回时没有用户数据。 我想要的是执行所有的查询然后返回值,我该怎么做?

我如何等待用户数据来?

像async这样的库(https://github.com/caolan/async)对这类事情有帮助。查看这些文档,因为它们显示了一些不同的场景示例。

+1

请建议我可以从异步库使用的功能 – XMen