このわずかに減少したコードでは、1週間以上の観測結果がAPIから一度にダウンロードされ、rows
に集約され、CSVにエクスポートされます。少なくともそれがアイデアです。実際に起こっているのは、promiseArray
からrows
にプッシュされた_promise
がundefined
として出ているので、が(図示されていない)exportToCsv
の関数で呼び出されているということです。私は何が欠けていますか?私のPromiseから値が返されないのはなぜですか?
$("#downloadBtn").click(function() {
weeks = getWeeks(startDate.val(), endDate.val()); // array like [[startDay1, endDay1], [startDay2, endDay2], ...]
// start downloading the data
var promiseArray = [];
for (i=0; i< weeks.length; i++) {
var _promise = Q.defer();
fetchDataWeek(weeks[i][0], weeks[i][1], _promise);
promiseArray.push(_promise) // Push this promise into the array
}
Promise.all(promiseArray).then(function() { // Wait for all promises to resolve
var rows = [headers];
for (i=0; i < promiseArray.length; i++) {
rows.push(promiseArray[i]);
}
exportToCsv(fileName, rows);
})
});
function fetchDataWeek(startDay, endDay, _promise) {
url = "https://api" + startDay + endDay + ".json";
$.ajax({
url: url,
success: function(result){
var weekRows = parseHistory(result);
_promise.resolve(weekRows);
},
error: function (error) {
_promise.reject(error) // rejecting it in case of error
}
});
}
// Extract all data from a query response
function parseHistory(data) {
var weekRows = [];
var days = data.history.days;
for (var i = 0; i < days.length; i++) {
dayRows = formatDay(days[i]);
for (var j= 0; j < dayRows.length; j++) {
weekRows.push(dayRows[j]);
}
}
return weekRows;
}
私はあなたの主な問題は、 '_promise'は**ない**約束が、[繰延オブジェクト](https://github.com/kriskowal/q#using-deferreds)であるということだと思います。 'promiseArray.push(_promise.promise)'が必要です。なぜあなたは 'Q' **と** native' Promise'を使っていますか? – Phil
[前のこの質問に対する回答](http://stackoverflow.com/a/42817932/1706564)。私はjQueryと約束を完全に受け入れています –