如何在nodejs中调用回调内部函数

时间:2016-12-20 19:24:33

标签: javascript node.js

像在javascript中一样调用nodejs中的外部函数,以便我们可以重用该函数,但在我的情况下它不起作用。为什么呢?

我猜它在nodejs中是异步工作的。我该如何解决?回调?我是nodejs的新手。

app.get('/googleSyncCallback', passport.authenticate('google', {
  failureRedirect: 'url'
}),

function(req, res) {

  var contacts = new GoogleContacts({
    token: req.token
  });
  var retrievedContacts = '';
  var retrievedContactsArr = [];

  contacts.getContacts(function(err, contacts) {
    contacts.forEach(function(entry) {
      retrievedContacts = {
        contact: {
          "phone": {
            "cell": entry.phoneNumber,
          }
        },
      }
      retrievedContactsArr.push(retrievedContacts);
      console.log('array... ', retrievedContactsArr[0]); //prints all values
    });
  });
  checkIfContactExists(req, res, retrievedContactsArr);
}
});

function checkIfContactExists(req, res, retrievedContactsArr) {
  //PRINTS UNDEFINED..
  console.log('array... ', retrievedContactsArr[0]); //// LINE 10
}

打印数组retrievedContactsArr[0]在第10行返回undefined。

1 个答案:

答案 0 :(得分:0)

您需要更改以将您的函数放入回调函数中,您还需要向函数添加回调函数,因为Express可以使用必须同步运行的签名(req,res)定义中间件,或者返回一个promise或者具有签名(req,res,next)其中next是回调。

app.get('/googleSyncCallback', passport.authenticate('google', {
  failureRedirect: 'url'
}),

function(req, res, next) {

  var contacts = new GoogleContacts({
    token: req.token
  });
  var retrievedContacts = '';
  var retrievedContactsArr = [];

  contacts.getContacts(function(err, contacts) {
    contacts.forEach(function(entry) {
      retrievedContacts = {
        contact: {
          "phone": {
            "cell": entry.phoneNumber,
          }
        },
      }
      retrievedContactsArr.push(retrievedContacts);
      console.log('array... ', retrievedContactsArr[0]);
      checkIfContactExists(req, res, retrievedContactsArr);
      next()
    });
  });

    }
    });

    function checkIfContactExists(req, res, retrievedContactsArr) {
      //PRINTS UNDEFINED..
      console.log('array... ', retrievedContactsArr[0]); //// LINE 10
    }