Published
Edited
Sep 17, 2018
Insert cell
Insert cell
function slowOp(passedThroughArgument) {
return new Promise((resolve, reject) => {
let wait = setTimeout(() => {
clearTimeout(wait)
resolve(passedThroughArgument)
}, Math.random()* 1000)
})
}
Insert cell
Insert cell
{
const orderOfReturnedValues = []
// async function pushImplicitlyLocked(argument) { // this async function
// await slowOp()
// orderOfReturnedValues.push(argument)
// }
function pushExplicitlyLocked(argument) { // might desugar to something like this
let explicitLockingPromise = Promise.resolve()
return explicitLockingPromise.then(slowOp).then(() => orderOfReturnedValues.push(argument))
}
await Promise.all([1,2,3,4,5,6,7,8,9].map(pushExplicitlyLocked)) // await instead of forEach to capture into the Promise.all
return orderOfReturnedValues
}
Insert cell
Insert cell
{
const orderOfReturnedValues = []
let explicitLock = Promise.resolve();
[1,2,3,4,5,6,7,8,9].forEach((i) => {
explicitLock = explicitLock.then(slowOp).then(_ => orderOfReturnedValues.push(i))
})
await explicitLock
return orderOfReturnedValues
}
Insert cell
Insert cell
{
const orderOfReturnedValues = []
function functionalExplicitLock() {
return [1,2,3,4,5,6,7,8,9].reduce((explicitLock, i) => {
return explicitLock.then(slowOp).then(_ => orderOfReturnedValues.push(i))
}, Promise.resolve())
}
await functionalExplicitLock()
return orderOfReturnedValues
}
Insert cell
Insert cell
{
function functionalVersion() {
return [1,2,3,4,5,6,7,8,9].reduce(
(lockedListSoFar, i) => lockedListSoFar.then(slowOp).then(l => [...l, i]),
Promise.resolve([])
)
}
return functionalVersion()
}
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more