Skip to content

Instantly share code, notes, and snippets.

@juanmaguitar
Last active June 20, 2018 10:22
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save juanmaguitar/99a8e5d0487095995afaa43a32d8f512 to your computer and use it in GitHub Desktop.
Save juanmaguitar/99a8e5d0487095995afaa43a32d8f512 to your computer and use it in GitHub Desktop.
callbacks vs promises vs generators vs async
// https://medium.com/@rdsubhas/es6-from-callbacks-to-promises-to-generators-87f1c0cd8f2e#.q7boouq4o
/* Step 1: Callback hell — N levels deep */
var request = require('request');
var url1='http://httpbin.org/', url2=url1, url3=url1, url4=url1;
function foo(finalCallback) {
request.get(url1, function(err1, res1) {
if (err1) { return finalCallback(err1); }
request.post(url2, function(err2, res2) {
if (err2) { return finalCallback(err2); }
request.put(url3, function(err3, res3) {
if (err3) { return finalCallback(err3); }
request.del(url4, function(err4, res4) {
// let's stop here
if (err4) { return finalCallback(err4); }
finalCallback(null, "whew all done");
})
})
})
})
}
// use that function somewhere
foo(function(err, message) {
if (err) {
return console.log("error!", err);
}
console.log("success!", message);
});
/* Step 2: Promises — 1 level deep */
var Promise = require('bluebird');
var request = Promise.promisifyAll(require('request'));
var url1='http://httpbin.org/', url2=url1, url3=url1, url4=url1;
function foo() {
return request.getAsync(url1)
.then(function(res1) {
return request.postAsync(url2);
}).then(function(res2) {
return request.putAsync(url3);
}).then(function(res3) {
return request.delAsync(url4);
}).then(function(res4) {
return "whew all done";
});
}
// use that function somewhere
foo().then(function(message) {
console.log("success!", message);
}).catch(function(err) {
console.log("error!", err);
});
/* Step 3: Promises+Generators — 0 level flat */
var Promise = require('bluebird');
var request = Promise.promisifyAll(require('request'));
var url1='http://httpbin.org/', url2=url1, url3=url1, url4=url1;
function* foo() {
var res1 = yield request.getAsync(url1);
var res2 = yield request.getAsync(url2);
var res3 = yield request.getAsync(url3);
var res4 = yield request.getAsync(url4);
return "whew all done";
}
foo = Promise.coroutine(foo);
// use that function somewhere
foo().then(function(message) {
console.log("success!", message);
}).catch(function(err) {
console.log("error!", err);
});
// ------------ for tests
var Promise = require('bluebird');
var assert = require('assert');
var request = Promise.promisifyAll(require('request'));
var url1='http://httpbin.org/', url2=url1, url3=url1, url4=url1;
describe('context', function() {
it('should kill callbacks', Promise.coroutine(function*() {
// Use destructuring since "request" returns multiple values
[res1] = yield request.getAsync(url1);
assert.equal(200, res1.statusCode);
// Array destructuring might not work in some node versions
// In that case, simply use res[0].statusCode
[res2] = yield request.getAsync(url2);
assert.equal(200, res2.statusCode);
[res3] = yield request.getAsync(url3);
assert.equal(200, res3.statusCode);
[res4] = yield request.getAsync(url4);
assert.equal(200, res4.statusCode);
// Yay! No more "done()" and no more callbacks
}));
});
/* Step 4: ES7 async/await */
var Promise = require('bluebird');
var request = Promise.promisifyAll(require('request'));
var url1='http://httpbin.org/', url2=url1, url3=url1, url4=url1;
async function foo() {
var res1 = await request.getAsync(url1);
var res2 = await request.getAsync(url2);
var res3 = await request.getAsync(url3);
var res4 = await request.getAsync(url4);
return "whew all done";
}
// use that function somewhere
foo().then(function(message) {
console.log("success!", message);
}).catch(function(err) {
console.log("error!", err);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment