Last active
April 13, 2016 00:35
-
-
Save loretoparisi/14ee82a26e814d10d8156d6faa77ed1d to your computer and use it in GitHub Desktop.
Example of using native Promise with deferred XMLHttpRequest
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 console = { | |
log: function(s) { | |
document.getElementById("console").innerHTML += s + "<br/>" | |
} | |
} | |
// Simple XMLHttpRequest | |
// based on https://davidwalsh.name/xmlhttprequest | |
SimpleRequest = { | |
call: function(what, response) { | |
var request; | |
if (window.XMLHttpRequest) { // Mozilla, Safari, ... | |
request = new XMLHttpRequest(); | |
} else if (window.ActiveXObject) { // IE | |
try { | |
request = new ActiveXObject('Msxml2.XMLHTTP'); | |
} catch (e) { | |
try { | |
request = new ActiveXObject('Microsoft.XMLHTTP'); | |
} catch (e) {} | |
} | |
} | |
// state changes | |
request.onreadystatechange = function() { | |
if (request.readyState === 4) { // done | |
if (request.status === 200) { // complete | |
response(request.responseText) | |
} else response(); | |
} | |
} | |
request.open('GET', what, true); | |
request.send(null); | |
} | |
} | |
/** | |
* Promise.All | |
* @param items Array of objects | |
* @param block Function block(item,index,resolve,reject) | |
* @param done Function Success block | |
* @param fail Function Failure block | |
* @example | |
promiseAll(["a","b","c"], | |
function(item,index,resolve,reject) { | |
MyApp.call(item,function(result) { | |
resolve(result); | |
}, | |
function( error ) { reject(error); }): | |
}, | |
function(result) { // aggregated results | |
},function(error) { // error | |
}) | |
* @author Loreto Parisi (loretoparisi at gmail dot com) | |
*/ | |
var promiseAll = function(items, block, done, fail) { | |
var self = this; | |
var promises = [], | |
index = 0; | |
items.forEach(function(item) { | |
promises.push(function(item, i) { | |
return new Promise(function(resolve, reject) { | |
if (block) { | |
block.apply(this, [item, index, resolve, reject]); | |
} | |
}); | |
}(item, ++index)) | |
}); | |
Promise.all(promises).then(function AcceptHandler(results) { | |
if (done) done(results); | |
}, function ErrorHandler(error) { | |
if (fail) fail(error); | |
}); | |
}; //promiseAll | |
// LP: deferred execution block | |
var ExecutionBlock = function(item, index, resolve, reject) { | |
SimpleRequest.call('http://icanhazip.com/', function(result) { | |
if (result) { | |
console.log("Response[" + index + "] " + result); | |
resolve(result); | |
} else { | |
reject(new Error("call error")); | |
} | |
}) | |
} | |
arr = [1, 2, 3] | |
promiseAll(arr, function(item, index, resolve, reject) { | |
console.log("Resolving item[" + index + "]") | |
ExecutionBlock(item, index, resolve, reject); | |
}, function(results) { // aggregated results | |
console.log("All done of " + results.length); | |
console.log(JSON.stringify(results)); | |
}, function(error) { // error | |
console.log(error); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Playground: https://fiddle.jshell.net/8qv6rxmr/