How to pass a callback that waits for the setTimeout to finish and return a promise.
Is there any tweak that can be done here to fix this, when a callback is passed from the function which makes the function to resolve after setTimeout
Or call getB
before promise.all()
and keep the result ready etc
function getA() { return "A"; } function getB(callback) { setTimeout(() => { callback("B"); }, 10); } function getC() { return Promise.resolve().then(() => "C"); } function getABC() { //need to work here only const cb = (val) => val; return Promise.all([getA(), getB(cb), getC()]); } getABC().then((arr) => console.log(arr)); // expected output [ 'A', 'B', 'C' ]
The expected output is [ 'A', 'B', 'C' ]
but receiving [ 'A', undefined, 'C' ]
what changes should I make here?
Advertisement
Answer
Update in response to your comment:
function getA () { return "A"; } function getB (callback) { setTimeout(() => { callback("B"); }, 10); } function getC () { return Promise.resolve().then(() => "C"); } function getABC () { const waitForCallback = (invoker) => new Promise(resolve => invoker(resolve)); return Promise.all([getA(), waitForCallback(getB), getC()]); } getABC().then(console.log);
Original answer:
Return a promise from getB
:
function getA () { return "A"; } function getB (callback) { return new Promise(resolve => { setTimeout(() => { resolve(callback("B")); }, 10); }); } function getC () { return Promise.resolve("C"); } function getABC () { const cb = (val) => val; return Promise.all([getA(), getB(cb), getC()]); } getABC().then(console.log.bind(console));