我很难从链中的以下函数中获取并移动响应。 值继续存在,但是我尝试将它们传递下去,输出总是空的。
我是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: [] }
答案 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,如果requestGoogle
和requestTwitter
不必连续运行,您可以重叠它们,以便请求同时运行:
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;
});
}