[英]How to wait for an HTTP Request before executing our code further in Node.js
[英]wait for http.request response before executing further
我制作了一个用户注册/登录系统。 用户可以通过电子邮件或短信进行注册。 然后通过电子邮件或短信发送激活密钥。
我有以下代码:
var activation_key_sent
switch (signup_method) {
case 'email':
try {
// send email
} catch (error) {
// handle errors
}
break
case 'telephone':
var text = await https.request({
hostname: 'api.xxxx.com',
port: xxx,
path: 'xxxx',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}, (res) => {
res.setEncoding('utf8')
res.on('data', (chunk) => {
if (parseInt(chunk) > 1) {
// query to log the error in the database
activation_key_sent = false
} else {
activation_key_sent = true
}
})
})
text.write(querystring.stringify({
USERNAME: 'xxxx',
SECRET: 'xxxx',
DESTINATION: 'xxxx',
SENDER: 'xxxx',
BODY: activation_key
}))
text.end()
break
}
console.log(activation_key_sent)
电子邮件部分工作正常。 问题出在文本部分。 当我发送文本时,我会收到来自服务器的响应(块)。 这是一个数字 1 或更高。 1 正常,高于 1 是错误。
当我执行此代码时,我看到 console.log(activation_key_sent) 未定义。 我想我必须在某处停止代码以等待响应。 我想在 res.on('data') 等待(我认为)。 我想等待响应,如果响应 = 1 -> 查询,如果没有,请进一步使用代码。
我想我需要 async/await 某处。 我试过将 async 添加到 res.on('data', async (chunck) => ... 并等待 chunk,但这不起作用。有谁知道我如何解决这个问题?
提前致谢!
尝试这种将 httpsRequest 包装在承诺中的方式。 这里的主要方法是你的 switch 语句嵌入的方法。
const respCode = 11; async function main() { var responseCode = await new Promise(res => { httpsRequest(res); }); // now you have responseCode from outside the callback console.log(responseCode); } // function with the similar signature to https.request function httpsRequest( /*other args, */ callback) { // mock your http request with the constant respCode from above setTimeout(() => { callback(respCode); }, 1000); } main();
Await 通常用于将承诺从回调样式语法解包为异步等待语法,如下所示: doRequest().then (response => {})
到var response = await doRequest()
。
你没有这样的承诺。
因此,当您将https.request
方法与回调( (res) =>
)时,您的 await 并没有真正执行任何操作。 如果你想插入功能,它必须在回调方法中,如下所示:
var activation_key_sent
switch (signup_method) {
case 'email':
try {
// send email
} catch (error) {
// handle errors
}
break
case 'telephone':
var text = await https.request({
hostname: 'api.xxxx.com',
port: xxx,
path: 'xxxx',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}, (res) => {
res.setEncoding('utf8')
res.on('data', (chunk) => {
if (parseInt(chunk) > 1) {
// query to log the error in the database
activation_key_sent = false
} else {
activation_key_sent = true
}
})
console.log(activation_key_sent)
})
text.write(querystring.stringify({
USERNAME: 'xxxx',
SECRET: 'xxxx',
DESTINATION: 'xxxx',
SENDER: 'xxxx',
BODY: activation_key
}))
text.end()
break
}
此外,如果您坚持将https.request
与 async / await 模式一起使用,那就是另一个话题了: https : https.request
-76a5a58ed90c
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.