Javascript async /等待响应没准备好

时间:2017-12-30 14:55:40

标签: node.js promise async-await

我很难从链中的以下函数中获取并移动响应。 值继续存在,但是我尝试将它们传递下去,输出总是空的。

我是nodejs中async / await的新手,但我们认为他们不需要像承诺一样解决。

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

响应未经修改且为空:

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

full file on Github

1 个答案:

答案 0 :(得分:1)

.then(requestTwitter(output)) 调用 requestTwitter(output)并将其返回值(承诺)传递给then。但是then期望回调,而不是承诺。与.then(console.log(output))类似。

你可能想把它们包装在函数中:

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

FWIW,如果requestGooglerequestTwitter不必连续运行,您可以重叠它们,以便请求同时运行:

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

同样值得注意的是,在这两种情况下,promise都会解析,对调用者没有任何有用的价值。您可以通过output解决此问题。为了防止请求之间的串扰,您还可以使output不是可以重用的模块全局,而是为每个请求创建的对象:

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