Posted to tcl by apn at Fri Jan 08 05:55:34 GMT 2016view pretty
Example session of checking urls in parallel (*async, non-blocking*) using promises: % set urls [list http://www.google.com http://127.0.0.1:1234 http://www.yahoo.com] http://www.google.com http://127.0.0.1:1234 http://www.yahoo.com % set gate [checkurls $urls] ::oo::Obj65 % $gate done puts {http://www.google.com/ ok} {http://127.0.0.1:1234/ error} {http://www.yahoo.com/ ok} % $gate destroy And the actual promise-based code: package require http package require lambda proc checkurl {url} { set prom [promise::Promise new] http::geturl $url -method HEAD -command [lambda {prom tok} { upvar #0 $tok url_state $prom fulfill [list $url_state(url) $url_state(status)] ::http::cleanup $tok } $prom] return $prom } proc checkurls {urls} { return [promise::all [lmap url $urls {checkurl $url}]] }