OpenCPU与JavaScript异步编程

OpenCPU与JavaScript异步编程,javascript,r,asynchronous,opencpu,Javascript,R,Asynchronous,Opencpu,我试图通过OpenCPU从MySQL数据库获取一些数据到我的JavaScript WebApp中。不知何故,我无法解决以下问题: 我的JavaScript函数如下所示: var array; //contains IDs already function getStuffFromDb(){ for(var i in array){ var query = "SELECT value FROM table WHERE id=" + array[i].id + ";"; ocpu

我试图通过OpenCPU从MySQL数据库获取一些数据到我的JavaScript WebApp中。不知何故,我无法解决以下问题:

我的JavaScript函数如下所示:

var array; //contains IDs already
function getStuffFromDb(){
  for(var i in array){
    var query = "SELECT value FROM table WHERE id=" + array[i].id + ";";
    ocpu.call("queryDb",{
      query : query
    }, function(session){
      session.getObject(function(data){
        array[i].data = data;
      });
    });
  }
}
我在这里为数组中的每个ID调用R函数“queryDb”。问题是,只有当数组的长度为1时,这才起作用,这似乎是正确的,因为ocpu.call异步工作。所以我可以想出两种解决方案,但还不能让任何东西起作用

Idea 1:将另一个参数传递给包含当前数组索引的R函数。然后让R函数再次返回该索引,以便我可以将数据插入数组的正确位置。这看起来应该有点像:

...
query : query,
index : i
...
session.getObject("index", function(index){
...
想法2:我认为必须有一种更方便的方法,而不必传递索引,但不幸的是,我不知道如何实现它。我尝试使用ocpu.rpc,因为我认为它是同步的,但结果是一样的

最后,想法2对我来说似乎是更好的选择,但我不知道如何去做。idea 1的问题是,除了调用的R函数的返回值之外,我找不到任何关于如何访问任何值的示例。我不应该像上面写的那样,通过session.getObject-method传递其名称来调用在被调用的R函数中设置的变量吗?我得到的所有信息都是“在call:get(reqobject,envir=sessionenv,inherits=FALSE)中找不到对象‘index’”


我真的很感谢这里的一些帮助,因为我在所有这些异步和R的东西中迷失了方向。因此,提前感谢您的回答

想法2听起来还不错。。。您可能必须摆脱循环,一个接一个地获取数据。仅在最后一个异步操作完成时调用下一个异步操作

这很好,但在答案中加入一部分代码更有用。