_any_ function that returns a promise should have the `async` modifier - even if `await` isn't used. A function may return a promise or throw an exception. An `async` function may only return a promise. async functions cannot throw exceptions. ``` // This code sucks but you might have to write it if `get` isn't an async function. try { get().catch(_ => /* handle async errors /) } catch { / handle sync errors */ } ```
Interesting about adding async. I actually didn’t know it eliminated the possibility of it throwing an error. What happens if it explicitly throws an error?
Mistakes we make using JavaScript Promises
51–60 of 60 posts
Re: Mistakes we make using JavaScript Promises
#52Earlier quoted context omitted.
Some older libraries will still be callback driven, and one important thing is always resolving or rejecting promise.
If it's callback driven, is it a Promise mistake or a callback mistake? I don't think it would apply here
Re: Mistakes we make using JavaScript Promises
#53Earlier quoted context omitted.
It's easy to run tasks in parallel with just "await". Just start your tasks without await, store the promise in a variable, and then use await later when you actually need the value.
That's fine, but you'll still only be able to block on one promise at a time. If you want to wait until all promises have resolved you still have to use Promise. all.
const xP = getX();
const yP = getY();
const x = await xP;
const y = await yP;
is just as parallel as const [x, y] = Promise.all([getX(), getY()]);Re: Mistakes we make using JavaScript Promises
#54Earlier quoted context omitted.
How does the resolve function work here? It is passed an object where one property is an object and the other a promise. The next then suddenly receives the resolved location..?
The argument passed to `resolve` gets returned from the resolve function and becomes available to any handler that handles it with `then`. In the above example, the object is being destructured as part of the arguments. The destructuring is probably what's tripping you up. // straightforward, no magic const simpleFunction = function() { return Promise.resolve({ name: 'simpleObject' }); } simpleFunction().then(functio…
Re: Mistakes we make using JavaScript Promises
#55Earlier quoted context omitted.
How does the resolve function work here? It is passed an object where one property is an object and the other a promise. The next then suddenly receives the resolved location..?
It iterates over all key/value pairs. For each value, if it is a promise it waits for it and replaces it with the result, while non-promises are left as-is. This is a fairly common function to have in promise libraries.
Re: Mistakes we make using JavaScript Promises
#56Earlier quoted context omitted.
It iterates over all key/value pairs. For each value, if it is a promise it waits for it and replaces it with the result, while non-promises are left as-is. This is a fairly common function to have in promise libraries.
That was my point. It’s not obvious to the reader that this is better since it’s a non-standard way of resolving promises. But it looks neat. I’ve never seen it, what library do you have experience with that does it this way?
Re: Mistakes we make using JavaScript Promises
#57Earlier quoted context omitted.
That's fine, but you'll still only be able to block on one promise at a time. If you want to wait until all promises have resolved you still have to use Promise. all.
Promises are started eagerly, so const xP = getX(); const yP = getY(); const x = await xP; const y = await yP; is just as parallel as const [x, y] = Promise.all([getX(), getY()]);
Re: Mistakes we make using JavaScript Promises
#58Earlier quoted context omitted.
Instead of subtle nesting, I would have passed through the user as part of the result of the second promise. get('//data.com/user) .then(user => resolve({user, location: get('//data.com/user')})) .then(({user, location}) => createEntry(user, location)) .then(response => { // handle response }).catch(err => { // handle failure }); Async/await is much cleaner now though.
I affably don’t know how anyone considers the .then syntax to be any better than the original callback hell version. Especially if you want your error handlers to be unique and to affect the flow. Sorry but the common shared catch at the end doesn’t usually suffice in the code I write. I find the async/await form he alludes to at the end to be the only form that improves upon the original callback version.
- Learn how .then()/.catch() works once and it's the same for all libraries.
- Can test against a common API.
- Can combine operations easily like with Promise.all(), which was very difficult with callbacks.
- Chaining is much better since you can return a promise within a promise, which allows for conditional promises.
- No nesting/right shifting, keeping the structure flatter.
Re: Mistakes we make using JavaScript Promises
#59Earlier quoted context omitted.
I affably don’t know how anyone considers the .then syntax to be any better than the original callback hell version. Especially if you want your error handlers to be unique and to affect the flow. Sorry but the common shared catch at the end doesn’t usually suffice in the code I write. I find the async/await form he alludes to at the end to be the only form that improves upon the original callback version.
It's not much more clear, but it is a standard, which has many advantages: - Learn how .then()/.catch() works once and it's the same for all libraries. - Can test against a common API. - Can combine operations easily like with Promise.all(), which was very difficult with callbacks. - Chaining is much better since you can return a promise within a promise, which allows for conditional promises. - No nesting/right shif…
Re: Mistakes we make using JavaScript Promises
#60Earlier quoted context omitted.
It's not much more clear, but it is a standard, which has many advantages: - Learn how .then()/.catch() works once and it's the same for all libraries. - Can test against a common API. - Can combine operations easily like with Promise.all(), which was very difficult with callbacks. - Chaining is much better since you can return a promise within a promise, which allows for conditional promises. - No nesting/right shif…
async/await has all of those same advantages plus more I believe (and I should add I agree with all of them).