0

我是 node.js 的新手并且有一个非异步的背景,因此这让我在试图理解如何正确地异步实现琐碎的同步任务时感到很愚蠢。

例如,我有一个对象。我是这样取的:

objManager.getObject(objId, function(error, object) {
  ...
})

objManager.getObject 实现对 mongoDB 的异步调用,获取对象并将其作为第二个参数传递给回调。然后我需要根据前一个对象返回一个新对象。但是对象中有一个标志,我需要从数据库中获取,或者设置一个默认值。这是我需要的逻辑:

objManager.getObject(objId, function(error, object) {
  var objToReturn = {
    first_prop: 1,
    second_prop: "2",
    third_prop: null
  };
  if (Globals.setThirdDefault) {
    // here i need to set it as default. 
    objToReturn.third_prop = defaultThird;
    // Then there is a lot of lines of code
    res.send();
  } else {
    // here I need to fetch the flag from mongoDB, 
    // and I need to repeat a "lot of lines" in the callback
    // as it is async, and if I won't do that, my res.send() 
    // will be called before callback returns
    objManager.getThirdValue(function (error, thirdValue) {
      objToReturn.third_prop = thirdValue;
      // again, there is a lot of lines of code
      res.send();
    })
  }
})

我认为可以管理它的一种方法是使用重复代码的函数,但这是正确的吗?我是否应该创建很多函数来管理我需要从数据库中获取的几个标志,像这样?

objManager.getObject(objId, function(error, object) {
  var objToReturn = {
    first_prop: 1,
    second_prop: "2",
    third_prop: null
  };

  var manageThird = function(thirdProp) {
    objToReturn.third_prop = thirdProp;
    // here will be my lines of code
  }

  if (Globals.setThirdDefault) {
    manageThird(defaultThird);
    res.send();
  } else {
    objManager.getThirdValue(function (error, thirdValue) {
      manageThird(thirdValue);
      res.send();
    })
  }
})

无论如何这会起作用吗?

4

0 回答 0