64 lines
1.8 KiB
JavaScript
64 lines
1.8 KiB
JavaScript
define("dojo/store/util/QueryResults", ["../../_base/array", "../../_base/lang", "../../_base/Deferred"
|
|
], function(array, lang, Deferred){
|
|
|
|
// module:
|
|
// dojo/store/util/QueryResults
|
|
|
|
var QueryResults = function(results){
|
|
// summary:
|
|
// A function that wraps the results of a store query with additional
|
|
// methods.
|
|
// description:
|
|
// QueryResults is a basic wrapper that allows for array-like iteration
|
|
// over any kind of returned data from a query. While the simplest store
|
|
// will return a plain array of data, other stores may return deferreds or
|
|
// promises; this wrapper makes sure that *all* results can be treated
|
|
// the same.
|
|
//
|
|
// Additional methods include `forEach`, `filter` and `map`.
|
|
// results: Array|dojo/promise/Promise
|
|
// The result set as an array, or a promise for an array.
|
|
// returns:
|
|
// An array-like object that can be used for iterating over.
|
|
// example:
|
|
// Query a store and iterate over the results.
|
|
//
|
|
// | store.query({ prime: true }).forEach(function(item){
|
|
// | // do something
|
|
// | });
|
|
|
|
if(!results){
|
|
return results;
|
|
}
|
|
// if it is a promise it may be frozen
|
|
if(results.then){
|
|
results = lang.delegate(results);
|
|
}
|
|
function addIterativeMethod(method){
|
|
if(!results[method]){
|
|
results[method] = function(){
|
|
var args = arguments;
|
|
return Deferred.when(results, function(results){
|
|
Array.prototype.unshift.call(args, results);
|
|
return QueryResults(array[method].apply(array, args));
|
|
});
|
|
};
|
|
}
|
|
}
|
|
addIterativeMethod("forEach");
|
|
addIterativeMethod("filter");
|
|
addIterativeMethod("map");
|
|
if(!results.total){
|
|
results.total = Deferred.when(results, function(results){
|
|
return results.length;
|
|
});
|
|
}
|
|
return results; // Object
|
|
};
|
|
|
|
lang.setObject("dojo.store.util.QueryResults", QueryResults);
|
|
|
|
return QueryResults;
|
|
|
|
});
|