@jiangmiao 上次你说到循环改写异步的问题, 我来自卖自夸了. 楼主另一个帖子里 (话说那个帖子删了? 我只好贴这里来了见谅) 那段代码改写成 Stekinscript 异步管道形式如下 (# 号之后是注释, 对比原有的 js 代码)
import handler, taskDao
handler.myTasklist: (msg, session, next): # handler.myTasklist = function(msg,session,next){
uid: session.uid # var uid = session.uid;
taskDao.myTasklist(uid, (error, res): # taskDao.myTasklist(uid,function(err,res){
# var tasks = [];
tasks: res |: # for(var i=0;i<res.length;i++){
# var task = res[i];
# (function(tasks,task){
taskDao.taskAttribute($.id, %(err, res)) # taskDao.taskAttribute(task.id,function(err,res){
# var attributes = []
attributes: res |: { # for(var j=0;j<res.length;j++){
# var attribute = {
title: $.title, # title:res[j].title,
attributevalue: $.attributevalue, # attributevalue:res[j].attributevalue
# };
# attributes.push(attribute);
} # }
$result.push({ # var taskinfo = {
title: $.title, # title:task.title,
type: $.title, # type:task.type,
status: $.status, # status:task.status,
attributes: attributes, # attributes:attributes
# };
# tasks.push(taskinfo);
}) # });
# })(tasks,task);
# }
next(null, { # next(null,{
route: 'onMytasklist', # route: 'onMytasklist',
tasks: tasks, # tasks: tasks
}) # });
) # });
上面那段代码 # };
用 Stekinscript 最新分支编译, 产生等价于 (之所以说等价于, 是删去一些无用语句并且进行代码格式化之后的结果) 下面的 js 代码, 将管道也就是循环中的异步改写成递归, 并且将之后的语句 (next 调用, 因为 stekinscript 会作一些 name mangle 因此生成的代码中叫做 $c_next) 放在递归的末尾执行
(function () {
handler.myTasklist = (function ($c_msg, $c_session, $c_next) {
var $c_uid;
$c_uid = $c_session.uid;
taskDao.myTasklist($c_uid, (function ($c_error, $c_resA) {
var $c_tasks;
(function ($list) {
if (!($list) || $list.length === undefined) throw 'not iterable';
function $next($index, $result) {
if ($index === $list.length) {
$c_tasks = $result;
$c_next(null, ({
"route": "onMytasklist",
"tasks": $c_tasks
}));
}
else {
var $element = $list[$index];
var $c_attributes, $c_err, $c_res;
taskDao.taskAttribute($element.id, (function ($tp_err, $tp_res) {
$c_err = $tp_err;
$c_res = $tp_res;
$c_attributes = (function ($list) {
if (!($list)) return;
var $result = [];
var $ind = 0;
var $next = function () {};
var $pipeRet;
for (var $k in $list) {
if ($ind === $list.length) {
break;
}
$pipeRet = (function ($index, $key, $element) {
$result.push(({
"title": $element.title,
"attributevalue": $element.attributevalue
}));
return [0];
})($ind, $k, $list[$k]);
switch ($pipeRet[0]) {
case 1:
return $pipeRet[1];
}++$ind;
}
return $result;
})($c_res);
$result.push(({
"title": $element.title,
"type": $element.title,
"status": $element.status,
"attributes": $c_attributes
}));
return $next($index + 1, $result);
}));
}
}
$next(0, []);
})($c_resA);
}));
});
})();
请多指教.