Skip to content

Instantly share code, notes, and snippets.

@colelawrence
Created July 16, 2014 03:37
Show Gist options
  • Save colelawrence/407646d2acc487e1b379 to your computer and use it in GitHub Desktop.
Save colelawrence/407646d2acc487e1b379 to your computer and use it in GitHub Desktop.
Promise file api example
{Deferred} = require 'promise.coffee'
fs = require 'fs'
nodeDef = (def) ->
(err, res) ->
if err?
def.reject err
else
def.resolve(res)
class FileOps
constructor: (value=null) ->
def = new Deferred
def.resolve(value)
@promise = def.promise
then: ->
@promise = @promise.then.apply @promise, arguments
@
read: (filename) ->
@then ->
def = new Deferred
fs.readFile filename, 'utf8', nodeDef(def)
def.promise
write: (filename) ->
@then (content) ->
def = new Deferred
if typeof content isnt "string"
def.reject TypeError ".write(path) requires content from previous promise"
else
fs.writeFile filename, content, nodeDef(def)
def.promise
log: (title) ->
@then (value) ->
def = new Deferred
# Log
console.log("<#{title}>") if title?
console.log value
# Continue chain with value
def.resolve value
def.promise
# Edit current value with function
edit: (fn) ->
@then (value) ->
def = new Deferred
def.resolve fn value
def.promise
# Declare time to delay
delay: (time) ->
# Return function ((value)->) to .then((value)->)
@then (value) ->
def = new Deferred
setTimeout (->
def.resolve(value)
), time
# Return the promise to .then(->return promise)
def.promise
(new FileOps("initial content"))
.read("package.json")
.log("Content read")
.delay(1000)
.edit (str)->
obj = JSON.parse(str)
obj.author = "ZombieHippie"
JSON.stringify obj, null, 2
.write("package2.json")
{
"name": "Promise-Tests",
"version": "0.0.1",
"dependencies": {
"promise.coffee": "~1"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment