2017-09-15 2 views
3

Ich versuche async/await in einer Expressroute zu verwenden und kann es nicht richtig funktionieren. Ich habe mir mehrere SO-Posts angeschaut und es scheint, dass ich es richtig mache.Async wartet auf Versprechen <pending>

Helfer:

module.exports = { 

facebook: function(userId, token) { 
    return new Promise(resolver) 
    function resolver(resolve, reject) { 
     graph.get(`${userId}/feed?access_token=${token}`, function(err, res) { 
     if (err) { 
      if(res.paging && res.paging.next) { 
       graph.get(res.paging.next, function(err2, res2) { 

       var arr = [] 

       res.data.forEach(function(e) { 
        if (e.hasOwnProperty('message')) { 
        arr.push(e.message) 
        } else if (e.hasOwnProperty('story')) { 
        arr.push(e.story) 
        } else { 
        console.log('something is not here') 
        } 
       }) 

       res2.data.forEach(function(e) { 
        if (e.hasOwnProperty('message')) { 
        arr.push(e.message) 
        } else if (e.hasOwnProperty('story')) { 
        arr.push(e.story) 
        } else { 
        console.log('something is not here') 
        } 
       }) 
       console.log(arr) 
       resolve(arr.toString()) 

       }) 

      } 
     } 
     }) 
    }  

    }, 
    twitter: function(twittername) { 
    return new Promise(resolver) 
    function resolver(resolve, reject) { 
     T.get('search/tweets', { q: `from:${twittername}`, count: 500 }, function(err, data, response) { 
     if (err) { 
      reject(err) 
      console.log(err) 
     } else { 
      data.statuses.forEach(function(e) { 
      arr.push(e.text) 
     }) 

     } 
     resolve(arr.toString()) 
    }) 

    } 

    console.log(arr) 
    return arr.toString() 
}, 
personalityInsights: function (fullString) { 
    console.log('fullString', fullString) 
    personality_insights.profile({ 
     text: fullString, 
     consumption_preferences: true 
    }, 
    function (err, response) { 
     if (err) {console.log(err)} 
     else console.log(response) 
    }); 
    } 
} 

Innen Route.js

async function main() { 
    try { 
     facebookR = await helpers.facebook(userId, accessToken) 
     twitterR = await helpers.twitter(twittername) 
     return await helpers.personalityInsights(`${facebookR} ${twitterR}`) 
    } catch (e) { 
     console.log('err main', e) 
    } 
    } 

main() 

Ich hatte ursprünglich ein Problem mit Rückrufe in meinen Helfern und konvertiert sie Versprechen mit, weil ich Async Funktionen verspricht Rückkehr gelernt. Aber mit diesem Code kann ich immer noch nicht die Werte zurückgeben, die ich möchte. Was mache ich falsch und wie kann ich es beheben?

+0

* "Aber mit diesem Code kann ich immer noch nicht die Werte zurückgeben, die ich möchte." * Welchen Wert möchten Sie von wo zurückgeben? Wie Sie sagten, "async" Funktionen geben Versprechen zurück. –

+0

'' helpers.personalityInsights ($ {facebookR} $ {twitterR}) '' ist letztlich, was ich zurückgeben möchte Die Idee ist, ich benutze Async warten auf Werte in einer bestimmten Reihenfolge, dann die zuletzt erwartete Funktion gibt die zurück Endergebnis. – Quesofat

+5

Und Sie wundern sich, warum 'main' stattdessen ein ausstehendes Versprechen zurückgibt? Nochmals, Sie haben es selbst gesagt: Async-Funktionen geben Versprechen zurück. Diese Verheißung wird sich schließlich zu "helpers.personalityInsights" ('$ {facebookR} $ {twitterR}') 'auflösen. Sie extrahieren den Wert eines Versprechens, Sie müssen einen Callback über '.then ', d. H.' Main(). Dann (result => console.log (result)) 'übergeben. –

Antwort

0
personalityInsights: function (fullString) { 
    console.log('fullString', fullString) 
    personality_insights.profile({ 
     text: fullString, 
     consumption_preferences: true 
    }, 
    function (err, response) { 
     if (err) {console.log(err)} 
     else console.log(response) 
    }); 
    } 

Sie sollten einige Werte von personalityInsights Funktion zurückkehren.

Verwandte Themen