OpenCPU和使用JavaScript进行异步编程

时间:2015-04-11 16:48:30

标签: 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.call("queryDb",{
      query : query
    }, function(session){
      session.getObject(function(data){
        array[i].data = data;
      });
    });
  }
}

我在这里为数组中的每个ID调用R函数“queryDb”。问题是这只有在数组的长度为1时才有效,这似乎是正确的,因为ocpu.call是异步工作的。所以我可以在这里考虑两个解决方案,但是还没有能够得到任何工作。

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

...
query : query,
index : i
...
session.getObject("index", function(index){
...

想法2:我认为必须有一种更方便的方式而不传递索引,但不幸的是我不知道如何实现它。我试图使用ocpu.rpc,因为我认为它是同步的,但结果是一样的。

最终想法2对我来说似乎是更好的选择,但我不知道如何做到这一点。想法1的问题是除了被调用的R函数的返回值之外,我找不到关于如何访问任何值的任何示例。我不会通过像我上面写的session.getObject方法一样调用在被调用的R函数中设置的变量吗?我得到的所有东西都是在调用中找不到“对象'索引:get(reqobject,envir = sessionenv,inherits = FALSE)”。

我真的很感激这里的一些帮助,因为我迷失在所有这些异步和R的东西中。所以,提前感谢任何答案!

1 个答案:

答案 0 :(得分:0)

创意2听起来并不太糟糕......你可能不得不摆脱循环并一个接一个地获取数据。仅在最后一个异步操作完成时调用下一个异步操作!