Bir dizi öğrenci aracılığıyla yinelemek ve her biri için http araması yapmak ve yanıtı ayrıştırmak ve mongodb'e eklemek istiyorum, bu yüzden bunu yapmak istiyorum Her öğrenciye birer birer birer birer eklenecek ve bir sonraki ile devam edecek, böylece CPU ve RAM Bellek için daha iyi olacak ...node.js'de promises kullanarak senkronize http çağrılarının nasıl yapılacağı
Şimdiye kadar bunu yapıyorum, ama bu bir sebepten dolayı Ben
var startDate = new Date("February 20, 2016 00:00:00"); //Start from February
var from = new Date(startDate).getTime()/1000;
startDate.setDate(startDate.getDate() + 30);
var to = new Date(startDate).getTime()/1000;
iterateThruAllStudents(from, to);
function iterateThruAllStudents(from, to) {
Student.find({status: 'student'})
.populate('user')
.exec(function (err, students) {
if (err) {
throw err;
}
async.eachSeries(students, function iteratee(student, callback) {
if (student.worksnap.user != null) {
var worksnapOptions = {
hostname: 'worksnaps.com',
path: '/api/projects/' + project_id + '/time_entries.xml?user_ids=' + student.worksnap.user.user_id + '&from_timestamp=' + from + '&to_timestamp=' + to,
headers: {
'Authorization': 'Basic xxx='
},
method: 'GET'
};
promisedRequest(worksnapOptions)
.then(function (response) { //callback invoked on deferred.resolve
parser.parseString(response, function (err, results) {
var json_string = JSON.stringify(results.time_entries);
var timeEntries = JSON.parse(json_string);
_.forEach(timeEntries, function (timeEntry) {
_.forEach(timeEntry, function (item) {
saveTimeEntry(item);
});
});
callback(null);
});
}, function (newsError) { //callback invoked on deferred.reject
console.log(newsError);
});
}
});
});
}
function saveTimeEntry(item) {
Student.findOne({
'worksnap.user.user_id': item.user_id[0]
})
.populate('user')
.exec(function (err, student) {
if (err) {
throw err;
}
student.timeEntries.push(item);
student.save(function (err) {
if (err) {
console.log(err);
} else {
console.log(Math.random());
}
});
});
}
function promisedRequest(requestOptions) {
//create a deferred object from Q
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var deferred = Q.defer();
var req = http.request(requestOptions, function (response) {
//set the response encoding to parse json string
response.setEncoding('utf8');
var responseData = '';
//append data to responseData variable on the 'data' event emission
response.on('data', function (data) {
responseData += data;
});
//listen to the 'end' event
response.on('end', function() {
//resolve the deferred object with the response
console.log('http call finished');
deferred.resolve(responseData);
});
});
//listen to the 'error' event
req.on('error', function (err) {
//if an error occurs reject the deferred
deferred.reject(err);
});
req.end();
//we are returning a promise object
//if we returned the deferred object
//deferred object reject and resolve could potentially be modified
//violating the expected behavior of this function
return deferred.promise;
}
It da .sonra içine saveEntry() seferde tüm öğrenciler için çağrıldığı görünüyor ... istedik ve sorunlu görünüyor. o sözlere, geri aramaları söz konusu olduğunda özellikle ... Herkes böyle bir şey elde herhangi fikri vardır
JavaScript yeni am ... Ben bu sorunu ve çözülmüş vermedi Tamam
'parser.parseString()' nedir? Bu senkron veya asenkron çalışma mı? – jfriend00
Ayrıca, bilmeniz gereken bir '' '' 'nı '' bir' '' '' '' '' '' '' '' '. Async operasyonunun bağırsaklarına geri dönüyor ve hiçbir zaman onu hiçbir yerde yakalayamıyorsunuz. Bu durumda atma kullanmayın. – jfriend00
Ayrıca, neden'_.forEach (timeEntry) '? Bu noktada timeEntry nedir? – jfriend00