CNode

关于node Koa2 异步回调的问题

问答
Eenternull发布于8 年前最后回复8 年前5 回复4066 浏览0 收藏
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)

L
lizhenwu#1·8 年前

注释掉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

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

S
Sunkaystar#2·8 年前

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

C
chenzeZzz#3·8 年前

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

E
enternull#4·8 年前
引用 chenzeZzz你要处理多个请求了,为什么要promise

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

C
chenzeZzz#5·8 年前
引用 enternull@chenzeZzz 不用promise 我收不到异步返回的结果啊

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

参与回复
登录后即可参与回复。登录