平常访问网络都会使用回调的方式,现在通过协程改变这种回调的模式,让异步方法按同步的方法来使用
-- 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)
这里一共使用了两个函数co
与yield
co
接收一个函数为参数,该函数由coroutine
协程去执行
yield
接收一个函数为参数,传入的函数会有一个next
函数类型的参数,返回值为next
函数传入的值,即
local result = yield(function(next)
next("success") -- 调用next()表示该函数运行结束,如果没有返回值直接next()即可 end) -- result: success