繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM