节点JS嵌套函数和变量范围

时间:2014-05-22 14:45:47

标签: mysql node.js scope

有没有办法将变量传递给嵌套回调,而不会在不必要的情况下将它们传递给每个函数?问题是我需要调用getValueFromTable1来获取数据库的一个值。获取结果并从原始列表中添加另一个变量并将其发送到getValueFromTable2以从数据库获取第二条信息,然后最终从顶级函数获取带有userID的result2并使用它来执行数据库插入。

我知道我可以使用连接进行更复杂的数据库查询,这样我就可以立即获取所有信息然后只调用一个函数,但是我的" getValueFromTable1"和" getValueFromTable2"是通用函数,从数据库中获取一组数据,我可以在多个地方重复使用,因此我尝试这样做的原因。

我得到的问题是,当我调用时,节点JS没有范围内的itemList

itemList[i].item2

而且我没有将item2传递给function2,因为function2并不需要它用于它自己的目的,它会使它需要一个它不需要的变量。

doDatabaseInsert(itemList, userID) {

  for(var i=0; i < itemList.length; i++) {

    getValueFromTable1(itemList[i].item1, function(results) {

      getValueFromTable2(results, itemList[i].item2, function(results2) {

        //Finally do stuff with all the information
        //Do DB insert statement with userID, and results2 into table 3
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

您不能使用常规for循环执行此操作,因为您从异步回调中引用i,其中i的值已经是itemList.length,因为for很久以前就已经完成了。

请改为尝试:

itemList.forEach(function(item) {

  getValueFromTable1(item.item1, function(results) {

    getValueFromTable2(results, item.item2, function(results2) {

      //Finally do stuff with all the information
      //Do DB insert statement with userID, and results2 into table 3
    });
  });
});