>That promise chain is not synchronous.
The promise chain is executed synchronously in an asynchronous context. You seem to misunderstand this nuance. `x => x + 1` is a synchronous function. It will always execute synchronously and will return a result when it is invoked and block (within its context) until that invocation is complete. However, its calling context may be paused/pre-empted.
Importantly though, the promise won't be pre-empted during the evaluation of a synchronous function:
function sleep(ms) {
var start = new Date().getTime(), expire = start + ms;
while (new Date().getTime() < expire) { }
return;
}
Promise.resolve(0).then(
(x) => {
for (i = 0; i < 15; i++) {
sleep(1000);
console.log(`doing stuff ${i}`);
}
}).then(console.log);
If you run this in your console and then try to do anything, you will be unable to. You'll be blocked by the asynchronous code (because it never releases). Replace my blocking sleep with setTimeout, a nonblocking alternative, and you'll find that things work normally. You're executing
synchronous, blocking code in an asynchronous context.
Promises aren't doing anything magical, they're simply syntactic sugar for flattening otherwise nested chains of this (where +1 is a standin for the action that this specific function is taking):
f = (cb, v) => cb(v + 1)
which quickly balloons to
f = (cb, v) => cb(v + 1)
(v) => (f(console.log, v))
f((v) => (f(console.log, v)), 1)
f((v) => (f((v) => (f(console.log, v)), v)), 1)
back to something sane:
Promise.resolve(1)
.then(f)
.then(f)
.then(f)
.then(console.log)
There's really no major difference between those two constructs (well, promises also provide infrastructure for releasing to another control.
All of those are synchronous functions, executed synchronously, in an asynchronous context, and all of them are called callbacks by what is perhaps the most authoritative source on web programming today.