Forked from juanmaguitar/callback-promises-generators-async.js
Created
January 26, 2018 05:43
-
-
Save deenjohn/783191a512ccb30893b7a0e3f00f985c to your computer and use it in GitHub Desktop.
callbacks vs promises vs generators vs async
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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