I'm new to promise, and trying to use promise in a for loop.
function query(queryString, keywords) {
var defer = q.defer();
connection.query(queryString + '"' + keywords + '"', function (err, rows) {
if (err) {
defer.reject(err);
} else {
defer.resolve(rows[0]);
}
});
return defer.promise;
}
q.all([
query(testQuery, 'test1'),
query(testQuery, 'test2')
]).then(console.log, console.log);
The above code is working and returns an array of results.
What I am trying to do is to use a for loop so I don't need to write the query every time.
query(testQuery, 'test1'),
query(testQuery, 'test2'),
query(testQuery, 'test3'),
query(testQuery, 'test4')
And here is my updated code:
function query(queryString, keywords) {
var defer = q.defer(),
results = [];
for (var i = 0; i < keywords.length; i++) {
connection.query(queryString + '"' + keywords[i] + '"', function (err, rows) {
if (err) {
defer.reject(err);
} else {
results.push(rows[0]);;
}
});
}
defer.resolve(results);
return defer.promise;
}
var tests = ['test1', 'test2'];
q.all(query(testQuery, tests)).then(console.log, console.log);
And the above code is not working which returns an empty array.
This seems not to be the correct way to use a for loop for promises. So in this case, how can I return an array of promises after a for loop?
Thanks.
Updated version (Based on @Bergi's comment):
function query(queryString, keywords) {
var defer = q.defer();
connection.query(queryString + '"' + keywords + '"', function (err, rows) {
if (err) {
defer.reject(err);
} else {
defer.resolve(rows[0]);
}
});
return defer.promise;
}
var tests = ['test1', 'test2'],
results = [];
for (var i = 0; i < tests.length; i++) {
results.push(query(testQuery, tests[i]));
}
q.all(results).then(console.log, console.log);
This is working, but I wonder if there is a way to include the for loop inside the query function. As I have to write a for loop every time when using this method.