連鎖約束について質問がありますが、これは少し異なります。 私は自分のコードでHTTPリクエストを取得しています。最初の呼び出しは配列を返します。配列内の各オブジェクトについては、別の配列を返すような別のhttp呼び出しを行う必要があります(この3つのレベルは深く連鎖しています)。 問題は、各http呼び出しを行うためにどの配列要素が使用されたかを把握する必要があり、約束を使用してこれを行う方法がわかりません。 私はまた、約束を返すことによってチェーンを終了したいと思います。連鎖データ(角度j)を維持しながら約束する
私は約束せずにnodejsで書かれて何をしたいのためのコードがあります。
var https = require('https');
var fs = require('fs');
function makeRequest(options){
var httpopts = {
host: 'soc.courseoff.com',
path: '/gatech/terms/201601/majors/' + options.p,
method: 'GET'
};
var response = "";
var req = https.request(httpopts, function(res) {
res.on('data', function(d) {
response += d;
});
res.on('end',function(){
options.cb(response,options)
})
});
req.end();
req.on('error', function(e) {
console.error(e);
});
}
var classData = {};
function getCourses(m){
var majors = JSON.parse(m);
majors.forEach(function(maj){
classData[maj] = {};
var options = {
p:maj.ident +'/courses',
cb:getSections,
major:maj
};
makeRequest(options);
});
}
var classCount = 0;
function getSections(c,opts){
var courses = JSON.parse(c);
courses.forEach(function(course){
classCount++;
var options = JSON.parse(JSON.stringify(opts));
options.p += '/'+course.ident+'/sections';
options.course = course
options.cb = buildData
makeRequest(options)
});
}
var sectionCount = 0;
function buildData(r, options){
var major = options.major.ident;
sectionCount++;
if(!classData[major]){
classData[major] = {
name: options.major.name,
classes:{}
};
}
classData[major].classes[options.course.ident] = {
name:options.course.name,
sections:JSON.parse(r)
};
console.log('classCount-sectionCount '+classCount + '---'+sectionCount);
if(classCount === sectionCount){
writeIt();
}
}
makeRequest({
p:'',
cb:getCourses
});
function writeIt(){
fs.writeFileSync('./classData.js', 'module.exports = ' + JSON.stringify(classData));
}
はEDIT: データのトラックを維持しながら、私は巣への約束を得ることができたが、どのように私は返すことができますが最終的に最終的なデータオブジェクトで解決される約束ですか? マイコード: ありがとうございました。私は私の唯一の問題は今、ほぼ確実に約束
fact.factory('ClassFactory', ['$http',function ($http) {
var eventData = {};
var promise;
var courseData = [];
var baseURL ='https://soc.courseoff.com/gatech/terms/201601/majors/';
eventData.getClasses = function (event) {
if(!promise){
promise = $http.get(baseURL).then(
function(majors){
Promise.all(majors.data.map(m => $http.get(baseURL + m.ident+'/courses')
.then(
function(courses){
if(!m.courses) m.courses = [];
courses.data.map(c => $http.get(baseURL+ m.ident+'/courses/' +c.ident+'/sections')
.then(
function(sections){
c.sections = sections.data;
m.courses.push(c);
}
));
courseData.push(m);
}
)));
}
)
}
return promise;
}
return eventData;
}]);
ありがとうございます!私はまだそれを約束として返す問題がある、元の質問を編集した – Noam
あなたはまだPromise.all自体を返す必要があると思います。他のcommenterノートのように、渡されたすべての関数は、値または別のPromiseを返さなければなりません。そうでない場合、返すものはすべて未定義です。 – Dtipson