2017-09-15 16 views
3

私はエクスプレスルートでasync/awaitを使用しようとしており、正しく動作することができません。私はいくつかのSOの投稿を見て、それは私がそれを正しくやっているようだ。Async Await Returns Promise <pending>

ヘルパー:

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) 
    }); 
    } 
} 

インサイド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() 

私はもともと私のヘルパーでのコールバックを使用して問題があったと私は非同期関数は約束を返す学んだので、約束にそれらを変換します。しかし、このコードでは、私はまだ私が望む値を返すことはできません。私は間違って何をしているのですか?どうすれば修正できますか?

+0

*「このコードでは、私はまだ私が望む値を返すことはできません」*どこから戻ってきたいのですか?あなたが言ったように、 'async'関数は約束を返します。 –

+0

'' helpers.personalityInsights($ {facebookR} $ {twitterR}) ''は最終的に私が返すものです アイデアは非同期で特定の順序で値を渡すことを待っています。最終結果。 – Quesofat

+5

なぜ、 'main'がなぜ代わりに未決の約束を返すのか疑問に思っていますか?再度、あなた自身が言った: 'async'関数は約束を返します。その約束は、最終的にhelpers.personalityInsights( '$ {facebookR} $ {twitterR}') 'が解決するものに解決されます。約束の価値を抽出すると、 '.then'、すなわち' main()。then(result => console.log(result)) 'を介してコールバックを渡す必要があります。 –

答えて

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) 
    }); 
    } 

あなたはpersonalityInsights関数からいくつかの値を返すべきです。