NodeJS,SQL异步问题

时间:2013-05-05 06:08:02

标签: javascript sql node.js sqlite asynchronous

我在nodeJS中序列化一些函数时遇到问题。我想要做的是创建一个临时视图,读取它,然后为ft数组中的每个元素删除它。这是我的代码。我在NodeJS中使用以下函数。 Db是节点的sqlite3插件。

function(){
 ft.forEach(function(fti){
  var view="create temporary view ..."+fti;
  db.exec(view,aftaView)
  console.log("created View "+fti);
 });
};
function aftaView(err){   
  if (err) console.log(err+" K ");      
  participantID.forEach(function(prt){
   Obj.forEach(function(bj){
     console.log("Object: "+bj);
      //perform second query here
     db.all("select ...", {$pID:prt,$obj:bj}, function(err,rows){
      if (err) throw err;
      rows.forEach(function (row) {
         //console.log(row);
       });
       //perform third function here, in readiness for second iterarion of the very                                                                          //           first loop
        db.run("drop view Kemp");
      });
 });

});
};

这是控制台输出:

created View 1
created View 2
created View 3
created View 4
created View 5
created View 6

//fails

Error: SQLITE_ERROR: view already exists

我显然需要确保第一个循环中的每个项目运行第二个函数,我只是不知道如何。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

您的问题可能与您认为自己的问题不同。并不是每个项目都没有运行afterView,而是在运行第一个afterView实例之前创建了所有视图。这来自于javascript中采用回调的方法的异步性质(不知道你正在使用的框架/库,但这是常态)。

您需要做的是确保一次只创建一个视图,并等到afterView完成后再继续下一个视图。