2017-12-30 3 views
0

Ich habe Schwierigkeiten bekommen und eine Antwort von den folgenden Funktionen in einer Kette zu bewegen. Die Werte existieren weiter oben, aber ich versuche sie zu übergeben, aber die Ausgabe endet immer leer.Javascript async/Antwort Antwort nicht bereit

Ich bin neu in Async/erwarten in Nodejs, aber angenommen, sie mussten nicht gelöst werden oder mit einem Versprechen.

let output = { 
    keywords: [], 
    steps: [], 
    twitter: [] 
} 

async function requestGoogle (output) { 
    const GoogleResponse = await (
    new Promise((resolve, reject) => { 
     const loc = utilities.checkOrigin() 
     googleMaps.directions({ 
     origin: loc.origin, 
     destination: loc.destination 
     }, (error, response) => { 
     if (error) resolve(error) 
     resolve({ 
      response 
     }) 
     }) 
    }) 
) 
    return GoogleResponse 
} 

async function requestTwitter (output) { 
    try { 
    const loc = utilities.checkOrigin() 
    const twitterParams = { 
     count: details.twitter.count, 
     geocode: loc.lat + loc.long + details.radius, 
     lang: details.lang, 
     result_type: 'recent' 
    } 
    await output.keywords.map(keyword => { 
     TwitterClient.get('search/tweets', {q: 'query'}, (error, tweets, response) => { 
     if (error) console.log(error) 
     tweets.statuses.map(tweet => { 
      output['twitter'].push({ 
      text: tweet.text 
      }) 
     }) 
     }) 
    }) 
    return output 
    } catch (error) { 
    console.error('++ requestTwitter flow', error) 
    } 
} 

flow.commuteCheck =() => { 
    return requestGoogle(output) 
    .then(requestTwitter(output)) 
    .then(console.log(output)) 
} 

Die Antwort ist unmodifizierten und leer:

{ keywords: [], steps: [], twitter: [] } 

full file on Github

+0

* Way * zu viel Code. Reduziere das Problem auf eine [mcve], die das Problem demonstriert, idealerweise ein ** runnable ** mit Stack Snippets (der '[<>]' Werkzeugleiste; [hier geht's] (https: //meta.stackoverflow). com/questions/358992/ive-wurde-to-do-a-runnable-Beispiel-mit-Stack-Snippets-how-do-i-do-tha)). –

Antwort

1

.then(requestTwitter(output))AnruferequestTwitter(output) und übergibt den Rückgabewert (ein Versprechen) in then. Aber then erwartet einen Rückruf, kein Versprechen. Ähnlich mit .then(console.log(output)).

Sie wahrscheinlich gemeint jene Funktionen wickeln:

flow.commuteCheck =() => { 
    return requestGoogle(output) 
    .then(() => requestTwitter(output)) 
    // ---^^^^^^ 
    .then(() => console.log(output)) 
    // ---^^^^^^ 
} 

FWIW, wenn requestGoogle und requestTwitter nicht in Serie laufen müssen, können Sie sie so die Anfragen gleichzeitig laufen können sich überschneiden:

flow.commuteCheck =() => { 
    return Promise.all([ 
    requestGoogle(output), 
    requestTwitter(output) 
    ]).then(() => console.log(output)); 
} 

Es ist auch wahrscheinlich erwähnenswert, dass in beiden Fällen die prom ise löst ohne nützlichen Wert für den Aufrufer auf. Möglicherweise haben Sie eine Lösung mit output. Um ein Übersprechen zwischen den Anfragen provent, können Sie auch machen output kein Modul global sein, die wiederverwendet wird, sondern ein Objekt, das Sie für jede Anfrage erstellen:

flow.commuteCheck =() => { 
    const output = output = { 
    keywords: [], 
    steps: [], 
    twitter: [] 
    }; 
    return Promise.all([ 
    requestGoogle(output), 
    requestTwitter(output) 
    ]).then(() => { 
    console.log(output); 
    return output; 
    }); 
}