JeffreyZhao/wind

编译器中可能存在的一个小问题

Closed this issue · 3 comments

以下这段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 不好意思确实贴错了。。
我有一个有相同问题的代码:

/*     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放到全局作用域里面,在结束操作时删除

那编译器没错,你的content变量只是在try代码块里的局部变量。要在下一个content里访问的话,可以把定义提出去。