JSFiddle - React, Tailwind, and code Playground

by ghostoy

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/q.js/1.0.0/q.min.js"></script>
<button onclick="run(writeFile)">writeFile</button>
<button onclick="run(testPromise)">testPromise</button>

JavaScript

function requestFS(cb, err) {
    navigator.webkitTemporaryStorage.requestQuota(10*1024*1024, function(grantedBytes) {
        webkitRequestFileSystem(TEMPORARY, grantedBytes, function(fs) {
            cb(fs);
        });
    }, err);
}

function run(generator) {
    var onError = function(e) { throw e; };
    var g = generator(function w(func, obj) {
        if (Object.prototype.toString.call(func) === '[object Function]') {
            return function() {
                var args = [].slice.call(arguments);
                args.push(function() {
                    g.next.apply(g, arguments);
                });
                args.push(onError);
                return func.apply(obj, args);
            };
        } else { // promise
            func.then(function() {
                g.next.apply(g, arguments);
            }, onError);
        }
    });
    g.next();
}

function *writeFile(w) {
    var fs = yield w(requestFS)();
    var fileEntry = yield w(fs.root.getFile, fs.root)('log.txt', {create: true});
    var fileWriter = yield w(fileEntry.createWriter, fileEntry)();
    fileWriter.onwriteend = function(e) {
        console.log('Write completed.');
    };
    
    fileWriter.onerror = function(e) {
        console.log('Write failed: ' + e.toString());
    };
    
    // Create a new Blob and write it to log.txt.
    var blob = new Blob(['Lorem Ipsum'], {type: 'text/plain'});
    
    fileWriter.write(blob);
}

function async() {
    var defer = Q.defer();
    setTimeout(function() {
        defer.resolve('asdf');
    }, 1000);
    return defer.promise;
}

function *testPromise(w) {
    var x = yield w(async());
    console.log(x);
}