2016-12-20 3 views
0

Вызов внешних функций в nodejs, как и в javascript, чтобы мы могли повторно использовать эту функцию, но в моем случае она не работает. Зачем?Как вызвать внешнюю функцию внутри обратного вызова в nodejs

Я предполагаю, что он работает асинхронно в nodejs. Как это исправить? Callbacks? Я новичок в 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.

+0

Асинхронное поведение, которое у вас здесь, не уникально для узла, оно является стандартным для языка javascript на разных платформах. – nem035

+0

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call) – nem035

+0

@ nem035 Обычно это не работает в javascript. Его не работает в nodejs только – Satyadev

ответ

0

Вам нужно изменить, чтобы поместить вашу функцию внутри обратного вызова, вам также необходимо добавить функцию обратного вызова функции, так как экспресс может определить промежуточное программное обеспечение с сигнатурой (req, res), которая должна выполняться синхронно или возвращать обещание или иметь подпись (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 
    } 
Смежные вопросы