Skip to content

Instantly share code, notes, and snippets.

@loretoparisi
Last active April 13, 2016 00:35
Show Gist options
  • Save loretoparisi/14ee82a26e814d10d8156d6faa77ed1d to your computer and use it in GitHub Desktop.
Save loretoparisi/14ee82a26e814d10d8156d6faa77ed1d to your computer and use it in GitHub Desktop.
Example of using native Promise with deferred XMLHttpRequest
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);
});
@loretoparisi
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment