编译器中可能存在的一个小问题
Closed this issue · 3 comments
kmod-midori commented
以下这段Wind.js源码:
try{
var result=$await(utils.httpsRequestAsync(options));
result=JSON.parse(result);
}catch(err){
err.message='Get issue token error:'+err.message;
throw err;
}
if(typeof result.code != 'undefined'){
token.code=result.code
return result;
}else{
throw 'Get issue token Failed.';
}
转换成的JavaScript是:
return _builder_$0.Combine(
/* try { */ _builder_$0.Try(
_builder_$0.Delay(function () {
/* var result = $await(utils.httpsRequestAsync(options, data)); */ return _builder_$0.Bind(utils.httpsRequestAsync(options, data), function (result) {
/* console.log(result); */ console.log(result);
return _builder_$0.Normal();
});
}),
/* } catch (err) { */ function (err) {
/* console.log("Error!"); */ console.log("Error!");
/* err.message = "Authorization request error:" + err.message; */ err.message = "Authorization request error:" + err.message;
/* throw err; */ return _builder_$0.Throw(err);
/* } */ },
null
),
_builder_$0.Delay(function () {
/* if (typeof result.access_token != "undefined") { */ if (typeof result.access_token != "undefined") {
/* this.access = result.token_type + " " + result.access_token; */ this.access = result.token_type + " " + result.access_token;
/* this.refresh_token = result.refresh_token; */ this.refresh_token = result.refresh_token;
/* return result; */ return _builder_$0.Return(result);
/* } else { */ } else {
/* throw "Authorization Failed."; */ return _builder_$0.Throw("Authorization Failed.");
/* } */ }
return _builder_$0.Normal();
})
可以发现var result=消失了
导致后面的代码抛出异常
如果这确实有些问题,希望能够解决
如果我的写法有误,希望能提供一下正确的写法。
谢谢。
JeffreyZhao commented
是不是贴错对应代码了?两段代码差别有点大……
kmod-midori commented
@JeffreyZhao 不好意思确实贴错了。。
我有一个有相同问题的代码:
/* var exist = $await(fs.existsAsync(path)); */ return _builder_$0.Bind(fs.existsAsync(path), function (exist) {
/* if (exist) { */ if (exist) {
return _builder_$0.Combine(
/* try { */ _builder_$0.Try(
_builder_$0.Delay(function () {
/* var content = $await(fs.readFileAsync(path)); */ return _builder_$0.Bind(fs.readFileAsync(path), function (content) {
return _builder_$0.Normal();
});
}),
/* } catch (err) { */ function (err) {
/* err.message = "Cannot read config file:" + err.message; */ err.message = "Cannot read config file:" + err.message;
/* throw err; */ return _builder_$0.Throw(err);
/* } */ },
null
),
_builder_$0.Delay(function () {
/* try { */ try {
/* var conf = JSON.parse(content); */ var conf = JSON.parse(content);
/* } catch (err) { */ } catch (err) {
/* err.message = "Invalid config data:" + err.message; */ err.message = "Invalid config data:" + err.message;
/* throw err; */ return _builder_$0.Throw(err);
/* } */ }
/* this.data = conf; */ this.data = conf;
/* this.path = path; */ this.path = path;
/* return true; */ return _builder_$0.Return(true);
})
在第二个try..catch...那里没有办法读取到content的值。
目前我的做法是把content放到全局作用域里面,在结束操作时删除
JeffreyZhao commented
那编译器没错,你的content
变量只是在try
代码块里的局部变量。要在下一个content
里访问的话,可以把定义提出去。