JSFiddle - React, Tailwind, and code Playground

by Duc Nghiem Xuan

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/q.js/1.4.1/q.js"></script>

CoffeeScript

tien = 3000
noi =
  name: "noi"
  cleaned: false

muaGao = (tien) ->
    deferred = Q.defer()
    if tien < 2000
        deferred.reject new Error("Khong du tien")
        return deferred.promise
    console.log "Dang mua gao"
    setTimeout(->
        deferred.resolve({name: "gao", cleaned: false})
    , 1000)
    return deferred.promise

voGao = (gao) ->
    deferred = Q.defer()
    if !gao? || gao.name != "gao"
        deferred.reject new Error("Khong co gao") 
        return deferred.promise
    if gao.cleaned
        deferred.resolve(gao)
        return deferred.promise
    console.log "Dang vo gao"
    setTimeout(->
        gao.cleaned = true
        deferred.resolve(gao)
    , 1000)
    return deferred.promise

ruaNoi = (noi) ->
    deferred = Q.defer()
    if !noi? || noi.name != "noi"
        deferred.reject new Error "Khong co noi" 
        return deferred.promise
    if noi.cleaned
        deferred.resolve noi
        return deferred.promise
    console.log "Dang rua noi"
    setTimeout(->
        noi.cleaned = true
        deferred.resolve(noi)
    , 1000)
    return deferred.promise

camCom = (noi, gao) ->
    deferred = Q.defer()
    if !noi? || noi.name != "noi"
        deferred.reject new Error "Khong co noi" 
        return deferred.promise
    unless noi.cleaned
        deferred.reject new Error "Chua rua noi" 
        return deferred.promise
    if !gao? || gao.name != "gao"
        deferred.reject new Error "Khong co gao" 
        return deferred.promise
    unless gao.cleaned
        error "Chua vo gao" 
        return deferred.promise
    console.log "Dang cam com"
    setTimeout(->
        deferred.resolve("com")
    , 1000)
    return deferred.promise

an = (com) ->
    if com != "com"
      console.error "Khong co com"
      return
    console.log "Nom nom"

pGao = muaGao(tien)
pNoiSach = ruaNoi(noi)
pGaoSach = pGao.then (x) -> 
                     voGao(x)
pCom = pNoiSach.then (ns) ->
  pGaoSach.then (gs) ->
    camCom(ns, gs)
pCom.done...