Source code
Revision control
Copy as Markdown
Other Tools
// |reftest| shell-option(--enable-promise-allkeyed) skip-if(!Promise.hasOwnProperty('allKeyed'))
/*---
feature: [Promise.allKeyed]
---*/
// Empty object
{
let result;
Promise.allKeyed({}).then(v => {
result = v;
});
drainJobQueue();
// Result object has null prototype as per spec
assertEq(Object.getPrototypeOf(result), null);
assertEq(Object.keys(result).length, 0);
}
// Single property with fulfilled promise
{
let result;
Promise.allKeyed({ a: Promise.resolve(1) }).then(v => {
result = v;
});
drainJobQueue();
assertEq(Object.getPrototypeOf(result), null);
assertEq(result.a, 1);
}
// Multiple properties with fulfilled promises
{
let result;
Promise.allKeyed({
a: Promise.resolve(1),
b: Promise.resolve(2),
c: Promise.resolve(3)
}).then(v => {
result = v;
});
drainJobQueue();
assertEq(Object.getPrototypeOf(result), null);
assertEq(result.a, 1);
assertEq(result.b, 2);
assertEq(result.c, 3);
}
// Mix of promise and non-promise values
{
let result;
Promise.allKeyed({
a: 1,
b: Promise.resolve(2),
c: 3,
d: Promise.resolve(4)
}).then(v => {
result = v;
});
drainJobQueue();
assertEq(Object.getPrototypeOf(result), null);
assertEq(result.a, 1);
assertEq(result.b, 2);
assertEq(result.c, 3);
assertEq(result.d, 4);
}
// Rejection - should reject if any promise rejects
{
let rejected = false;
let rejectionReason;
Promise.allKeyed({
a: Promise.resolve(1),
b: Promise.reject("error"),
c: Promise.resolve(3)
}).then(
v => { throw new Error("Should not fulfill"); },
reason => {
rejected = true;
rejectionReason = reason;
}
);
drainJobQueue();
assertEq(rejected, true);
assertEq(rejectionReason, "error");
}
// Async resolution order (promises resolve in different order than keys)
{
let result;
let resolve1, resolve2, resolve3;
let p1 = new Promise(res => { resolve1 = res; });
let p2 = new Promise(res => { resolve2 = res; });
let p3 = new Promise(res => { resolve3 = res; });
Promise.allKeyed({ a: p1, b: p2, c: p3 }).then(v => {
result = v;
});
// Resolve in reverse order
resolve3("third");
drainJobQueue();
resolve2("second");
drainJobQueue();
resolve1("first");
drainJobQueue();
assertEq(Object.getPrototypeOf(result), null);
assertEq(result.a, "first");
assertEq(result.b, "second");
assertEq(result.c, "third");
}
if (typeof reportCompare === "function")
reportCompare(0, 0);