操作channel
使用ch_open
打开一个channel:
let channel = ch_open({address} [, {options}])
if ch_status(channel) == "open"
" use the channel
{address}
是一个形式为”hostname:port”的字符串,指定address的channel意味着channel使用socket进行通信。
如果是通过start_job
打开job,并使用job_getchannel
获得channel,并且jog的{options}指明了io方式为pipe(默认),那么channel使用pipe进行通信
{options}
是一个字典类型,可选值有:
- “mode”: 交换信息的格式
- “json”
- “js”
- “nl” - 以NL结尾的信息
- “raw”
- “callback”: 一个当信息被接收到时会调用的函数,形式为:
func Handle(channel, msg) echo 'Received: ' . a:msg endfunc let channel = ch_open("localhost:8765", {"callback": "Handle"})
- “close_cb”: 一个当channel关闭是调用的函数,形式为:
func CloseHandler(channel)
- “drop”: 指定什么时候丢弃信息:
- “auto”: 当没有会调函数处理信息时
- “never”: 所有的信息都会保存
- “waittime”:
- “timeout”:
使用ch_close
关闭一个channel,当channel使用socket通信是,ch_close
会关闭所有的socket,当channel使用pipes通信时,如果pipes使用了stdin, stdout, stderr时,它们也会关闭,所以谨慎使用ch_close,关闭job使用job_stop
会更加合适。
" 获得channel的状态
ch_status(channel)
"fail" Failed to open the channel.
"open" The channel can be used.
"buffered" The channel was closed but there is data to read.
"closed" The channel was closed.
" 获得和channel关联的job
ch_getjob(channel)
" 从channel中读取信息(使用channel的timeout)
let output = ch_read(channel)
" 从channel中读取信息(不适用channel的timeout)
let output = ch_read(channel, {'timeout':0})
交换信息
JSON or JS
当mode是JSON或者JS时,可以通过ch_evalexpr
交换信息:
let response = ch_evalexpr(channel, {expr})
它会异步等待另一边传回的信息
如果仅仅向另一边发送信息,不处理相应或者让channel注册的回调函数处理相应,可以使用ch_sendexper
call ch_sendexpr(channel, {expr})
发送信息并指定特别的回调函数出来响应:
call ch_sendexpr(channel, {expr}, {'callback': Handler})
RAW or NL
当mode是RAW或者NL时,可以通过ch_evalraw
交换信息:
let response = ch_evalraw(channel, {string})
call ch_sendraw(channel, {string})
call ch_sendraw(channel, {string}, {'callback': 'MyHandler'})
- older
- Newer