码迷,mamicode.com
首页 > 其他好文 > 详细

Lua中协程的使用

时间:2016-07-04 11:31:45      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

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

-- 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

Lua中协程的使用

标签:

原文地址:http://www.cnblogs.com/houmingamedevelop/p/5639737.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!