Skip to content

Instantly share code, notes, and snippets.

@hvrauhal
Created August 24, 2015 10:08
Show Gist options
  • Save hvrauhal/a5580741097be44c8fc8 to your computer and use it in GitHub Desktop.
Save hvrauhal/a5580741097be44c8fc8 to your computer and use it in GitHub Desktop.
This demonstrates a problem when using async disposers with bluebird's using
var Promise = require('bluebird')
var using = Promise.using
var statefulResource = {
closed: false,
log: function (param) {
if (!statefulResource.closed) {
console.log('resource usage:', param)
} else {
console.log('resource no longer available for logging', param)
throw new Error("already closed")
}
return Promise.delay(30)
}
}
using(getResource(), function (resource) {
var theResourceUsingPromise = Promise.delay(20).then(function () {
resource.log("Hello from first promise! (DELETE FROM USER)")
return Promise.delay(20)
})
return Promise.all([theResourceUsingPromise, Promise.delay(1).then(function () {
throw new Error("Reject on parallel promise")
})])
}).catch(function (e) {
console.log('The whole stack failed with:', e)
})
function getResource() {
console.log('Providing resource (BEGIN)')
return Promise.resolve(statefulResource).disposer(function (resource, promise) {
if (promise.isFulfilled()) {
return resource.log('Cleaning up on success (COMMIT)').then(doClose)
} else {
return resource.log('Cleaning up on error (ROLLBACK)').then(doClose)
}
function doClose() {
statefulResource.closed = true
console.log('Resource closed')
}
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment