Lua中协程的使用

    平常访问网络都会使用回调的方式,现在通过协程改变这种回调的模式,让异步方法按同步的方法来使用

-- co.lua
yield   = coroutine.yield
co      = function(func, cb)
    local cor = coroutine.create(func)
    local next = coroutine.resume
    local hasNext; hasNext = function(status, func, ...)
        -- suspended
        if not status then return end
        -- only function
        if type(func) == "function" then
            -- call function
            func(--[[callback]]function(...)
                hasNext(next(cor, ...))
            end)
        elseif cb then
            cb(func, ...)
        end
    end
    hasNext(next(cor))
end



-- test.lua
require("co")

-- 网络异步操作
function request(url)
    return function(next)
        ...

        next("网络返回结果")
    end
end

-- 运行一个协程方法
co(function()
    local result = yield(request("http://login.9173.com"))
    local result_json = json.decode(result)
    if result_json.ok then
        -- other code
    end
end)



这里一共使用了两个函数coyield


co接收一个函数为参数,该函数由coroutine协程去执行

yield接收一个函数为参数,传入的函数会有一个next函数类型的参数,返回值为next函数传入的值,即

local result = yield(function(next)
    next("success") -- 调用next()表示该函数运行结束,如果没有返回值直接next()即可
end)

-- result: success
posted @ 2016-07-04 10:42  木水枫  阅读(2012)  评论(0编辑  收藏  举报