平常访问网络都会使用回调的方式,现在通过协程改变这种回调的模式,让异步方法按同步的方法来使用
-- 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
时间: 2024-10-06 08:15:24