var one = await Array.fromAsync(new InterruptableAsyncIterator(2));
assertEq(one.length, 2)
assertEq(one[0], 0);
assertEq(one[1], 1);
var two = new InterruptableAsyncIterator(10, 2); var threw = false; try { var res = await Array.fromAsync(two);
} catch (e) {
threw = true;
assertEq(e, "Exception");
}
assertEq(threw, true); // The iterator is not closed unless we have an abrupt completion while mapping.
assertEq(two.closed, false);
// Test throwing while mapping: Iterator should be closed. var three = new InterruptableAsyncIterator(10, 9);
threw = false; try { var res = await Array.fromAsync(three, (x) => { if (x > 3) { throw"Range"
} return x;
});
} catch (e) {
assertEq(e, "Range");
threw = true;
}
assertEq(threw, true);
assertEq(three.closed, true);
// We should close the iterator when define property throws. // Test by defining into a frozen object. var frozen = new Frozen(10);
threw = false; try { var result = await Array.fromAsync.call(Frozen, frozen);
} catch (e) {
threw = true;
}
// Ensure Array.from and Array.fromAsync use consistent error reporting. var expected = await errorMessage(() => Array.from(badSyncIterator)); var actual = await errorMessage(() => Array.fromAsync(badSyncIterator));
assertEq(actual, expected);
// Ensure for-of iteration and Array.fromAsync use consistent error reporting. var expected = await errorMessage(() => { for (var _ of badSyncIterator); }); var actual = await errorMessage(() => Array.fromAsync(badSyncIterator));
assertEq(actual, expected);
// Ensure await for-of iteration and Array.fromAsync use consistent error reporting. var expected = await errorMessage(async () => { for await (var _ of badAsyncIterator); }); var actual = await errorMessage(() => Array.fromAsync(badAsyncIterator));
assertEq(actual, expected);
})();
drainJobQueue();
(async function () { function* gen() { for (let i = 0; i < 4; ++i) {
yield Promise.resolve(i);
}
};
var array = await Array.fromAsync(gen());
// Promise values are unwrapped via AsyncFromSyncIterator.
assertEqArray(array, [0, 1, 2, 3]);
})();
drainJobQueue();
(async function () { var badSyncIterator = {
[Symbol.iterator]: 123,
};
var badAsyncIterator = {
[Symbol.asyncIterator]: 123,
};
// Ensure Array.from and Array.fromAsync use consistent error reporting. var expected = await errorMessage(() => Array.from(badSyncIterator)); var actual = await errorMessage(() => Array.fromAsync(badSyncIterator));
assertEq(actual.endsWith("is not iterable"), expected.endsWith("is not iterable"));
// Ensure for-of iteration and Array.fromAsync use consistent error reporting. var expected = await errorMessage(() => { for (var _ of badSyncIterator); }); var actual = await errorMessage(() => Array.fromAsync(badSyncIterator));
assertEq(actual.endsWith("is not iterable"), expected.endsWith("is not iterable"));
// Ensure await for-of iteration and Array.fromAsync use consistent error reporting. var expected = await errorMessage(async () => { for await (var _ of badAsyncIterator); }); var actual = await errorMessage(() => Array.fromAsync(badAsyncIterator));
assertEq(actual.endsWith("is not iterable"), expected.endsWith("is not iterable"));
})();
drainJobQueue();
var g = newGlobal();
g.asyncGen = asyncGen; var p = g.evaluate(`
Array.fromAsync(asyncGen(4))
`)
p.then((x) => {
assertEq(x instanceof Array, false); // Should use the other global's Array.
assertEq(x instanceof g.Array, true);
})
drainJobQueue();
var g2 = newGlobal({ newCompartment: true });
g2.asyncGen = asyncGen; var p = g2.evaluate(`
Array.fromAsync(asyncGen(4))
`)
p.then((x) => {
assertEq(x instanceof Array, false); // Should use the other global's Array.
assertEq(x instanceof g2.Array, true);
nukeCCW(x); // this will throw if x happens to not be a CCW (it should be!)
})
drainJobQueue();
// Test having a CCW 'this' value.
g2.obj = {}; var p2 = g2.evaluate(`
Array.fromAsync.call(obj, asyncGen(4))
`)
p2.then((x) => {
assertEq(x instanceof Array, false); // Should use the other global's Array.
assertEq(x instanceof g2.Array, true);
nukeCCW(x);
})
drainJobQueue();
// Verify user promise resolution behaviour. var myThenCalled = false; var obj = { then: () => { myThenCalled = true; } } function* genO() {
yield obj; return;
}
var res = Array.fromAsync(genO());
res.then((x) => {
assertEq(x[0], obj);
assertEq(myThenCalled, true);
});
drainJobQueue();
function* thrower() { thrownew Error();
}
g2.thrower = thrower; var p = g2.evaluate(`Array.fromAsync(thrower())`)
p.catch((e) => {
assertEq(e instanceof Error, true, "Should throw an error from the current global");
})
drainJobQueue();
p = g2.evaluate(`Array.fromAsync(thrower, 1)`);
p.catch((e) => assertEq(e instanceof g2.Error, true, "Should throw error from g2"))
drainJobQueue();
if (typeof reportCompare === 'function')
reportCompare(true, true);
Messung V0.5
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.