gpt4 book ai didi

javascript - 在进一步执行之前等待 http.request 响应

转载 作者:太空宇宙 更新时间:2023-11-03 23:50:10 25 4
gpt4 key购买 nike

我制作了一个用户注册/登录系统。用户可以通过电子邮件或短信进行注册。然后通过电子邮件或短信发送激活 key 。

我有以下代码:

    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)

电子邮件部分工作正常。问题出在文本部分。当我发送文本时,我会从服务器收到响应( block )。这是数字 1 或更高。 1 表示正常,高于 1 表示错误。

当我执行此代码时,我看到 console.log(activation_key_sent) 未定义。我想我必须在某个地方停止代码以等待响应。我想在 res.on('data') 处等待(我想)。我想等待响应,如果响应 = 1 -> 查询,如果没有,则进一步使用代码。

我想我需要在某个地方进行异步/等待。我尝试将 async 添加到 res.on('data', async (chunck) => ... 和await chunk,但这不起作用。有人知道如何解决这个问题吗?

提前致谢!

最佳答案

更新:

尝试用这种方式将您的 httpsRequest 包装在 promise 中。这里的主要方法是嵌入 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 通常用于将 promise 从回调样式语法解包为异步等待语法,如下所示:doRequest().then (response => {})var response = wait doRequest()

你没有这样的 promise 。

因此,当您使用带有回调 ((res) =>) 的 https.request 方法时,您的等待实际上不会执行任何操作。如果你想插入功能,它必须在回调方法中,如下所示:

    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://medium.com/@gevorggalstyan/how-to-promisify-node-js-http-https-requests-76a5a58ed90c

关于javascript - 在进一步执行之前等待 http.request 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59755388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com