关于node Koa2 异步回调的问题
发布于 7 年前 作者 enternull 3479 次浏览 来自 问答
function demo(context, next) {
    console.log(1)
        setTimeout(() => {
            let string_num = Date.now()
            console.log(string_num)
            context.body = string_num
            context.res.end()
        }, 1000)
    })
}

写了个DEMO 流程是发起请求然后 console.log(1) 程序中有个定时器 延迟一秒后返回数据 前端接收不到数据 但是加入promise

function demo(context, next) {
    console.log(1)
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            let string_num = Date.now()
            console.log(string_num)
            context.body = string_num
            context.res.end()
            resolve()
        }, 1000)
    })
}

它就变成同步的了 每次输出时间戳后才会处理下一个请求 请问nodejs有什么方式可以接收多个请求然后异步返回数据的嘛? 框架用的koa2

5 回复

你要处理多个请求了,为什么要promise

@chenzeZzz 不用promise 我收不到异步返回的结果啊

@enternull 服务路由没问题,你有请求就会有返回,promise可以控制返回的时间,但是高并发应当让请求尽快返回

注释掉context.res.end()就可以了

const Koa = require('koa')
const app = new Koa()
const http = require('http')

app.use(function demo(context, next) {
    console.log(Date.now())
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            let string_num = Date.now()
            // console.log(string_num)
            context.body = string_num
            // context.res.end()
            resolve(string_num)
        }, 1000)
    })
})

app.listen(3000, () => {
    console.log('server runnning on 3000')
})

function testPort() {
    http.get('http://localhost:3000', res => {
        let error
        if(res.statusCode !== 200) {
            error = new Error(`请求失败:${res.statusCode}`)
        }
        if(error) {
            res.resume()
            console.log(error.message)
            return
        }
        let data = ''
        res.on('data', chunk => {
            data += chunk
        }).on('error', (e) => {
            console.log(`错误: ${e.message}`)
        }).on('end', () => {
            console.log(data.toString())
        })
    })
}
testPort()
testPort()

输出

// 1524705937439
// 1524705937439
// 1524705938461
// 1524705938461

不知道是不是你想要的结果😂

我觉得可以使用ES6的async/await,当然promise在有些情况也是必须的。

回到顶部