MatAtBread / fast-async

605 stars 21 forks source link

async/await with for...of cannot work #69

Closed Otobelikethee closed 4 years ago

Otobelikethee commented 4 years ago

validate([1,2,3,5]).then(() => { console.log(true); }) .catch(err => { console.log(err); })


* partial transpiled code
```javascript
function validate(numbers) {
  return new Promise(function ($return, $error) {
    var $Try_1_Finally = function ($Try_1_Exit) {
      return function ($Try_1_Value) {
        try {
          var $Try_2_Finally = function ($Try_2_Exit) {
            return function ($Try_2_Value) {
              try {
                if (_didIteratorError) {
                  throw _iteratorError;
                }

                return $Try_2_Exit && $Try_2_Exit.call(this, $Try_2_Value);
              } catch ($boundEx) {
                return $error($boundEx);
              }
            }.bind(this);
          }.bind(this);

          var $Try_2_Catch = function ($exception_3) {
            try {
              throw $exception_3;
            } catch ($boundEx) {
              return $Try_2_Finally($error)($boundEx);
            }
          }.bind(this);

          try {
            if (!_iteratorNormalCompletion && _iterator.return != null) {
              _iterator.return();
            }

            return $Try_2_Finally().call(this);
          } catch ($exception_3) {
            $Try_2_Catch($exception_3)
          }

          return $Try_1_Exit && $Try_1_Exit.call(this, $Try_1_Value);
        } catch ($boundEx) {
          return $error($boundEx);
        }
      }.bind(this);
    }.bind(this);

    var totalNumber;
    var _iteratorNormalCompletion = true;
    var _didIteratorError = false;
    var _iteratorError = undefined;

    var $Try_1_Post = function () {
      try {
        if (totalNumber % 2 === 0) {
          return $return(true);
        } else {
          return $error(new Error('the validation fails'));
        }

        return $return();
      } catch ($boundEx) {
        return $error($boundEx);
      }
    };

    var $Try_1_Catch = function (err) {
      try {
        _didIteratorError = true;
        _iteratorError = err;
        return $Try_1_Finally($Try_1_Post)();
      } catch ($boundEx) {
        return $Try_1_Finally($error)($boundEx);
      }
    };

    try {
      for (var _iterator = numbers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
        var number = _step.value;
        totalNumber += number;
      }

      return $Try_1_Finally($Try_1_Post)();
    } catch (err) {
      $Try_1_Catch(err)
    }
  });
}

The promise doesn't get resolved / rejected. Because $Try_1_Finally never invoke the $Try_1_Exit.

 try {
            if (!_iteratorNormalCompletion && _iterator.return != null) {
              _iterator.return();
            }

            return $Try_2_Finally().call(this); // it returns here.
          } catch ($exception_3) {
            $Try_2_Catch($exception_3)
          }
          // will never get executed.
          return $Try_1_Exit && $Try_1_Exit.call(this, $Try_1_Value);
        } catch ($boundEx) {
          return $error($boundEx);
        }
function mapTryCatch(node, path, down) {
        if (node.$needsMapping) {
            var continuation, ctnName, catchBody;
            var ref = path[0];
            if ('index' in ref) {
                var i = ref.index + 1;
                var afterTry = ref.parent[ref.field].splice(i, ref.parent[ref.field].length - i);
                if (afterTry.length) {
                    ctnName = ident(node.$seh + "Post") ;
                    var afterContinuation = down(makeBoundFn(ctnName.name, afterTry, [], getExit(path, [opts]).$error));
                    ref.parent[ref.field].splice(ref.index, 0, afterContinuation);
                    continuation = parsePart("return $0()", [node.finalizer ? deferredFinally(node, ctnName) : ctnName]).body[0];
                } else if (node.finalizer) {
                   // change `returnThisCall` => `thisCall`
                    continuation = returnThisCall(deferredFinally(node)); 
                }
            } else {
                throw new Error(pr.filename + " - malformed try/catch blocks");
            }

Versions