在发出 POST 请求之前等待来自外部 API 的数据
Posted
技术标签:
【中文标题】在发出 POST 请求之前等待来自外部 API 的数据【英文标题】:Wait for data from external API before making POST request 【发布时间】:2018-07-14 19:17:59 【问题描述】:我将 IBM Watson Tone Analyzer API 与 Express.js 和 React 结合使用。我有这段代码可以向 Watson API 发送一些测试:
// 音调分析器.js 类音调分析 构造函数() 常量参数 = 用户名:process.env.USERNAME, 密码:process.env.PASSWORD, 版本日期:'2018-01-31' this.Analyzer = new ToneAnalyzerV3(params); 音调分析器(输入) 让音调= this.Analyzer.tone(输入,(错误,音调)=> if (err) console.log(err.message) 让voiceTone =tone.document_tone.tones[0].tone_id; console.log(voiceTone) // 在 Node.js 控制台上记录正确的值 返回语音; ); 回声; module.exports = 音调分析;然后我像这样在我的 Express 后端使用它:
// server.js const ToneAnalysis = require('./api/tone-analysisr'); 常量应用程序 = 快递(); 常量输入 = tone_input: '我很高兴', content_type: '文本/纯文本' app.get('/api/tone', (req, res) => 让音调=新音调分析()。音调分析器(输入); 返回 res.send( 音调:音调 ); );我在这里从 React 进行 API 调用:
// 应用程序.js 组件DidMount() this.callApi() .then(res => 控制台.log(res.tone); // 在 Chrome 控制台上记录错误的值 ) .catch(err => console.log(err)); callApi = async () => const response = await fetch('/api/tone'); const body = 等待 response.json(); if (response.status !== 200) throw new Error(body.message); 控制台日志(正文); 返回身体; ;我希望res.tone
的值是string
,显示从音调分析功能(new ToneAnalysis().ToneAnalyser(input);
)获得的音调。相反,我得到了
我认为这是因为 res.send(...)
在 tone
之前运行,具有来自 API 的值。我的问题是,如何让 res.send(...)
仅在 tone
具有值之后运行?
我尝试将this.Analyzer.tone(input, [callback])
中的回调函数包装在async/await
块中,但这并没有解决问题。任何有关如何解决此问题的想法都将受到高度赞赏。谢谢!
【问题讨论】:
对话有网络功能。因此,您可以在对话中调用音调分析器。 【参考方案1】:如果调用
let tone = new ToneAnalysis().ToneAnalyser(input);
返回一个承诺然后你可以做类似的事情
tone.then(res.send.bind(res))
【讨论】:
它返回一个对象。但多亏了你的回答,我才明白。我修改了ToneAnalyser
方法以返回一个promise 而不是一个对象。然后我在server.js
中解决了它,我使用tone.then(...)
获取了返回值
很高兴我的回答有帮助以上是关于在发出 POST 请求之前等待来自外部 API 的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Angular2 向外部 API 发出 POST 请求?
如何向外部 Rest Api 发出 Http Post 请求? [关闭]
Laravel 4 使用数据从控制器向外部 url 发出 post 请求