2016-12-20 29 views
0

私たちがjavascriptで行うようにnodejsで外部関数を呼び出すので、関数を再利用できるようになりますが、私の場合は機能しません。どうして?nodejsのコールバック内で外部関数を呼び出す方法

私はnodejsで非同期に動作すると推測しています。これをどうやって解決するのですか?コールバック?私はnodejsが初めてです。配列retrievedContactsArr[0]を印刷

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 
} 

ラインあなたは、コールバックの内側にあなたの関数を置くように変更する必要がある10

+0

ここでの非同期動作はノード固有のものではなく、プラットフォーム間のjavascript言語の標準です。 – nem035

+0

[非同期呼び出しからの応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – nem035

+0

@ nem035これは通常、javascriptでは機能しません。そのノードで動作していない – Satyadev

答えて

0

でundefinedを返しますされ、あなたには、エクスプレスはミドルウェアを定義することができるよう、関数にコールバックを追加する必要がありますシグネチャ(req、res、next)がコールバックである場合、シグネチャ(req、res)を同期して実行するか、または約束を返す必要があります。

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 
    } 
関連する問題