mirror of
https://github.com/swc-project/swc.git
synced 2025-01-03 11:01:52 +03:00
fix(es/helpers): Fix for await
(#5458)
This commit is contained in:
parent
f9b3870c12
commit
b655bf473a
@ -1 +0,0 @@
|
||||
console.log("Ensure that the directory is tracked by git");
|
@ -1 +0,0 @@
|
||||
console.log("Ensure that the directory is tracked by git");
|
10
crates/swc/tests/exec/issues-5xxx/5383/exec.js
Normal file
10
crates/swc/tests/exec/issues-5xxx/5383/exec.js
Normal file
@ -0,0 +1,10 @@
|
||||
const a1 = [1, 2, 3];
|
||||
const a2 = a1.map((x) => Promise.resolve(x));
|
||||
|
||||
async function f() {
|
||||
for await (const v of a2) {
|
||||
console.log(v);
|
||||
}
|
||||
}
|
||||
|
||||
f();
|
@ -1,17 +1,42 @@
|
||||
function _asyncIterator(iterable) {
|
||||
var method;
|
||||
|
||||
if (typeof Symbol === "function") {
|
||||
if (Symbol.asyncIterator) {
|
||||
method = iterable[Symbol.asyncIterator];
|
||||
if (method != null) return method.call(iterable);
|
||||
}
|
||||
|
||||
if (Symbol.iterator) {
|
||||
method = iterable[Symbol.iterator];
|
||||
if (method != null) return method.call(iterable);
|
||||
}
|
||||
var method, async, sync, retry = 2;
|
||||
for ("undefined" != typeof Symbol && (async = Symbol.asyncIterator, sync = Symbol.iterator); retry--;) {
|
||||
if (async && null != (method = iterable[async])) return method.call(iterable);
|
||||
if (sync && null != (method = iterable[sync])) return new AsyncFromSyncIterator(method.call(iterable));
|
||||
async = "@@asyncIterator", sync = "@@iterator";
|
||||
}
|
||||
|
||||
throw new TypeError("Object is not async iterable");
|
||||
}
|
||||
|
||||
function AsyncFromSyncIterator(s) {
|
||||
function AsyncFromSyncIteratorContinuation(r) {
|
||||
if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object."));
|
||||
var done = r.done;
|
||||
return Promise.resolve(r.value).then(function (value) {
|
||||
return {
|
||||
value: value,
|
||||
done: done
|
||||
};
|
||||
});
|
||||
}
|
||||
return AsyncFromSyncIterator = function (s) {
|
||||
this.s = s, this.n = s.next;
|
||||
}, AsyncFromSyncIterator.prototype = {
|
||||
s: null,
|
||||
n: null,
|
||||
next: function () {
|
||||
return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));
|
||||
},
|
||||
return: function (value) {
|
||||
var ret = this.s.return;
|
||||
return void 0 === ret ? Promise.resolve({
|
||||
value: value,
|
||||
done: !0
|
||||
}) : AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments));
|
||||
},
|
||||
throw: function (value) {
|
||||
var thr = this.s.return;
|
||||
return void 0 === thr ? Promise.reject(value) : AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments));
|
||||
}
|
||||
}, new AsyncFromSyncIterator(s);
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
const a1 = [1, 2, 3];
|
||||
const a2 = a1.map((x) => Promise.resolve(x));
|
||||
|
||||
async function f() {
|
||||
for await (const v of a2) {
|
||||
console.log(v);
|
||||
}
|
||||
}
|
||||
|
||||
f();
|
@ -1,17 +1,44 @@
|
||||
export default function _asyncIterator(iterable) {
|
||||
var method;
|
||||
|
||||
if (typeof Symbol === "function") {
|
||||
if (Symbol.asyncIterator) {
|
||||
method = iterable[Symbol.asyncIterator];
|
||||
if (method != null) return method.call(iterable);
|
||||
}
|
||||
|
||||
if (Symbol.iterator) {
|
||||
method = iterable[Symbol.iterator];
|
||||
if (method != null) return method.call(iterable);
|
||||
}
|
||||
var method, async, sync, retry = 2;
|
||||
for ("undefined" != typeof Symbol && (async = Symbol.asyncIterator, sync = Symbol.iterator); retry--;) {
|
||||
if (async && null != (method = iterable[async])) return method.call(iterable);
|
||||
if (sync && null != (method = iterable[sync])) return new AsyncFromSyncIterator(method.call(iterable));
|
||||
async = "@@asyncIterator", sync = "@@iterator";
|
||||
}
|
||||
|
||||
throw new TypeError("Object is not async iterable");
|
||||
}
|
||||
|
||||
|
||||
|
||||
function AsyncFromSyncIterator(s) {
|
||||
function AsyncFromSyncIteratorContinuation(r) {
|
||||
if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object."));
|
||||
var done = r.done;
|
||||
return Promise.resolve(r.value).then(function (value) {
|
||||
return {
|
||||
value: value,
|
||||
done: done
|
||||
};
|
||||
});
|
||||
}
|
||||
return AsyncFromSyncIterator = function (s) {
|
||||
this.s = s, this.n = s.next;
|
||||
}, AsyncFromSyncIterator.prototype = {
|
||||
s: null,
|
||||
n: null,
|
||||
next: function () {
|
||||
return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));
|
||||
},
|
||||
return: function (value) {
|
||||
var ret = this.s.return;
|
||||
return void 0 === ret ? Promise.resolve({
|
||||
value: value,
|
||||
done: !0
|
||||
}) : AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments));
|
||||
},
|
||||
throw: function (value) {
|
||||
var thr = this.s.return;
|
||||
return void 0 === thr ? Promise.reject(value) : AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments));
|
||||
}
|
||||
}, new AsyncFromSyncIterator(s);
|
||||
}
|
Loading…
Reference in New Issue
Block a user