繁体   English   中英

为什么我的承诺没有返回任何价值?

[英]Why is no value returned from my Promise?

在这个稍微减少的代码中,每周一次从API下载一次或多个星期的观察值,并将其汇总rows并导出到CSV。 至少那是主意。 实际发生的是,在(未显示) exportToCsv函数中Uncaught (in promise) TypeError: Cannot read property 'toString' of undefinedUncaught (in promise) TypeError: Cannot read property 'toString' of undefined因为从_promisepromiseArrayrows promiseArrayundefined 我想念什么?

$("#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;
}

一个诺言不是一个神奇的对象,它在解决时会“变成”一个不同的值。 当你做rows.push(promiseArray[i]); ,您是在收集承诺对象,而不是它们包含的结果。

要访问已兑现或将要兑现的结果,您需要将.then(…)回调链接到其,在其中您可以将结果作为参数进行访问。 要从数组中的所有promise收集结果,可以使用Promise.all ,它返回另一个promise,该promise不但要等待所有输入promise,而且要用其结果值数组来实现。

$("#downloadBtn").click(function() {
    var weeks = getWeeks(startDate.val(), endDate.val());
    // start downloading the data
    var promiseArray = weeks.map(function(week) { // map is simpler than a loop with `push`
        return fetchDataWeek( week[0], week[1] );
    })
    Promise.all(promiseArray).then( function(results) { // Wait for all promises to resolve
        var rows = [headers].concat(results);
        exportToCsv( fileName, rows );
    })
});

function fetchDataWeek( startDay, endDay, _promise ) {
    var url = "https://api" + startDay + endDay + ".json";
    var jQpromise = $.ajax({
        url: url
    });
    var qPromise = Q(jQpromise);
    return qPromise.then(parseHistory);
}

function parseHistory(data) {
    var weekRows = [];
    var days = data.history.days;
    for (var i = 0; i < days.length; i++) {
        var dayRows = formatDay( days[i] );
        for (var j= 0; j < dayRows.length; j++) {
            weekRows.push(dayRows[j]);
        }
    }
    return weekRows;
}

您可以在then处理程序中收到诺言的结果:

Promise.all(promiseArray).then( function (results) { // Wait for all promises to resolve
    var rows = [headers].concat(results);
    exportToCsv( fileName, rows );
  })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM