为什么我的 Promise 没有返回任何值?

杰米·布尔

在这个稍微简化的代码中,每周一次从 API 下载一个或多个星期的观察结果,然后汇总rows并导出到 CSV。至少这是一个想法。实际发生的事情是Uncaught (in promise) TypeError: Cannot read property 'toString' of undefined在(未显示)exportToCsv函数中引发了an 因为_promisepromiseArrayto推送rows出来的undefined. 我错过了什么?

$("#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 不是一个神奇的对象,当它被解析时“变成”一个不同的值。当你在做的时候rows.push(promiseArray[i]);,你正在收集承诺对象而不是它们包含的结果。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的函数返回 Promise { <pending> }

为什么 promise 没有返回?

为什么我的异步函数返回Promise {<pending>}而不是值?

为什么我的异步函数返回Promise {<pending>}而不是值?

为什么生成器没有返回任何值?

为什么这个函数似乎没有返回任何值

为什么axios返回promise而不是值?

为什么我的方法没有返回任何东西?

为什么Promise没有get()函数?

为什么browser.wait(ExpectedConditions.presenceOf())使我的方法链返回Promise <Promise <boolean?>>

为什么Promise会返回对象Promise,即使我显式地设置了return?

尽管我没有从方法中返回任何值,但为什么这会在我的代码上发生?

为什么我的函数没有返回正确的值

为什么我的代码没有返回斜边的值?

为什么我的函数没有返回正确的值键?

为什么Body.json()返回Promise?

.then 在返回 promise 之前运行,为什么?

为什么Promise在.then之后返回为<Pending>?

为什么Promise.reject()需要返回?

为什么当我 console.log my promise 时返回整数值

为什么在没有执行带有“if”的 Promise 之后被阻塞?

为什么我的函数没有返回?

为什么从“ findLocation()”返回值未定义的promise?

为什么我的第2个javascript promise调用返回与第一个相同的值?

为什么我的带有promise的递归函数只能等待一次?

在 node.js 中,为什么在使用 Promise 读取异步文件后我的数据没有被传回

为什么for ... of等待Promise解析而.forEach()没有呢?

为什么Node JS在Promise调用后没有退出

为什么try catch块没有捕获promise异常?