我个人的感觉是从python的yield来的,会在yield这里停止住 外部使用迭代器的next就可以运行yield 但是它是如何实现异步的呢
7 回复
Generator是为JavaScript设计的一种轻量级的协程。它通过yield关键字,可以控制一个函数暂停或者继续执行Generator函数有一个特别的语法function* (),借助这种超能力,我们还可以暂停或者继续执行异步操作,使用像promise或者”thunks”这样的结构来写出看起来像同步的代码。
回调在异步领域退出前台是必然的。
javascript对协程还是遮遮掩掩的,这种设计其实很不好,不伦不类。但也可以理解,javascirpt有历史包袱,有太多的回调代码需要兼容,node又是整个建立在回调基础上的,用node的人还要坚持两三年啊。
协程肯定是比回调对编程更友好的,经过适当的处理,回调就可以通过协程转化为形式同步。在c层面可以继续存在回调,也是在c层面实现回调转换,每个连接开启一个协程,回调返回唤醒协程,返回数据,将来的异步代码就是这个样子的。
server.lua
local tcp = require('tcp')
local onconnect = require('onconnect')
local options = {
host: 127.0.0.1,
port: 8080,
onconnect : onconnect,
}
tcp.createServer(options);
onconncet.lua
local redis = require('redis')
local function onconnect(socket, server)
while true do
local length = 100
local data, err = socket:read(length)
if err do
print(err.message)
socket:close()
break
end
local rc, err = redis:connect('127.0.0.1', 8000)
if err do
end
local ret, err = rc:get('test')
if err do
end
msg = data..ret
-- 下次异步操作就会启动超时检测,超时就会返回超时错误
socket:setTimeout(10)
local len, err1 = socket:write(msg)
if err1 do
print(err1.message)
socket:close()
break
end
local data1, err = socket:read(156)
if err do
socket:close()
break
end
end
end