Created
July 30, 2011 04:40
-
-
Save geuis/1115202 to your computer and use it in GitHub Desktop.
When-Then (pseudo javascript Promise)
This file contains hidden or 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
| var when = function(){ | |
| if( !(this instanceof when) ) return new when(arguments); //return new instance of itself | |
| var self = this; //cached so the syntax of code within the function is more readable | |
| self.pending = Array.prototype.slice.call(arguments[0]); //convert arguments passed in to array | |
| self.pending_length = self.pending.length; //cache length of the arguments array | |
| self.results = []; //container for results of async functions | |
| (function(){ // define pass() within this context so that the outer scope of self(this) is available when pass() is executed within the user's async functions | |
| self.pass = function(){ | |
| self.results.push(arguments); //push async results to cache array | |
| if( self.results.length === self.pending_length ) //if all async functions have finished, pass the results to .then(), which has been redefined to the user's completion function | |
| self.then.call(self, self.results); | |
| }; | |
| })(); | |
| } | |
| when.prototype = { | |
| then: function(){ | |
| this.then = arguments[0]; //reassign .then() to the user-defined function that is executed on completion. Also ensures that this() can only be called once per usage of when() | |
| while(this.pending[0]){ | |
| this.pending.shift().call(this, this.pass); //execute all functions user passed into when() | |
| } | |
| } | |
| } | |
| //#### TEST CASE 1 #### | |
| when( | |
| function(pass){ | |
| pass(2); | |
| }, | |
| function(pass){ | |
| setTimeout(function(){ | |
| pass(1000); | |
| }, 1000); | |
| }, | |
| function(){ | |
| setTimeout(function(){ | |
| pass(100); | |
| }, 100); | |
| }, | |
| function(){ | |
| setTimeout(function(){ | |
| pass(2000); | |
| }, 2000); | |
| } | |
| ) | |
| .then(function(results){ | |
| console.log(results); | |
| }) | |
| //#### TEST CASE 2 (Node.js required) #### | |
| var http = require('http'); | |
| var get = function(url, pass){ | |
| http.get({ host: url, port: 80 }, function(res){ | |
| var body = []; | |
| res.on('data', function(chunk){ | |
| body.push(chunk); | |
| }) | |
| .on('end', function(){ | |
| pass(body.join('')); | |
| }); | |
| }) | |
| .on('error', function(err){ | |
| pass(err); | |
| }); | |
| } | |
| when( | |
| function(pass){ | |
| get('www.google.com', pass); | |
| }, | |
| function(pass){ | |
| get('news.ycombinator.com', pass); | |
| }, | |
| function(pass){ | |
| get('io9.com', pass); | |
| } | |
| ) | |
| .then(function(results){ | |
| console.log(results); | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I had been trying to improve organic visibility for a few client projects in the UAE but kept running into the same issue where traffic would fluctuate without any stable growth, and a colleague from digital marketing mentioned a structured approach he had seen in practice, which led me to explore SEO Agency in Dubai. I started applying a more organized process after that, but only after a few trial-and-error attempts with content and technical fixes did things begin to settle, with rankings becoming more consistent and the incoming traffic turning more relevant. It felt less like guessing and more like following a clear direction, so I’d recommend it if you want something that actually builds over time rather than short-lived results.