-1

我尝试通过 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-method 传递其名称来调用在被调用的 R 函数中设置的变量吗?我得到的一切都是“在调用中找不到对象'索引':get(reqobject,envir = sessionenv,inherits = FALSE)”。

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

4

1 回答 1

0

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

于 2015-04-19T14:40:04.900 回答