我试图从promise返回一个推送数据数组,然后多次循环以填充所有数据。 例如,我得到了一个品牌列表和一个接受品牌参数并返回推送数据数组的函数。

var datasetarr = [];
brandlist = ['Bh', 'Ruffles'];

let promiseKey = new Promise((resolve, reject) => {
    for(var i = 0; i < brandlist.length; i++){
        datasetarr = populateData(brandlist[i], datasetarr);
    }
    resolve(datasetarr);
});

promiseKey.then((arr) => {
    console.log('complete promise');
    for(var i = 0; i < arr.length; i++){
        console.log(arr[i].date + ' ' + arr[i].total);
    }
});

错误消息是

Uncaught (in promise) TypeError: Cannot read property 'length' of undefined
    at promiseKey.then

由于设法打印出详细信息,因此数据获取没有问题。 这意味着承诺没有正确解决。 这是从promise返回数组的正确方法吗? 我不确定哪一部分错了。

#1楼 票数:3

首先,您的populateData需要返回一个Promise-在这种情况下,它将是在data.forEach中创建的已解决的promise数组。

var brandlist = ['Bh', 'Ruffles'];

let promiseKey = Promise.all(brandlist.map(brand => populateData(brand)))
.then(results => [].concat(...results)); // flatten the array of arrays

promiseKey.then((arr) => {
    console.log('complete promise');
    for(var i = 0; i < arr.length; i++){
        console.log(arr[i].date + ' ' + arr[i].total);
    }
});

function populateData(brand, datasetarr) {
    console.log('go in');
    var query;// = // query by brand parameter
    return query.once('value').then(data => {
        var promises = [];
        data.forEach(snapshot => {
            // get each receipt item details

            // get receipt details by receipt ID
            var query;// = // query receipts
            promises.push(query.once('value').then(data => { 
                // removed code
                // managed to print out here so data fetching is not a problem
                console.log(brand + ' ' + date + ' ' + itemTotal);
                return {date: date, total: itemTotal};
            })); 
        }); 
        return Promise.all(promises);
    });
}

或者,使用一周前我在此答案中给您的snapshotToArray函数

const snapshotToArray = snapshot => {
    const ret = [];
    snapshot.forEach(childSnapshot => {
        ret.push(childSnapshot);
    });
    return ret;
};

function populateData(brand, datasetarr) {
    console.log('go in');
    var query;// = // query by brand parameter
    return query.once('value').then(data => Promise.all(snapshotToArray(data).map(snapshot => {
        // get each receipt item details

        // get receipt details by receipt ID
        var query;// = // query receipts
        return query.once('value').then(data => { 
            // removed code
            // managed to print out here so data fetching is not a problem
            console.log(brand + ' ' + date + ' ' + itemTotal);
            return {date: date, total: itemTotal};
        }); 
    }))); 
}

#2楼 票数:2

虽然可以使用从任何地方push送到的全局数据集datasetarray变量,但我还是建议不datasetarray 而是编写一个getData方法,该方法返回一个数组(对数组的承诺),并在多次调用后(每个品牌一次)将它们连接在一起。

const brandlist = ['Bh', 'Ruffles'];
const promiseKey = Promise.all(brandlist.map(getData)).then(arrays => [].concat(...arrays));
promiseKey.then(arr => {
    console.log('complete promise');
    for (const item of arr)
        console.log(item.date + ' ' + item.total);
});

function getData(brand) { // no array parameter!
    console.log('go in');
    const query = …; // query by brand parameter
    return query.once('value').then(data => {
        const promises = toArray(data).map(snapshot => {
        const query = …; // get receipt item details by receipt ID
        return query.once('value').then(data => { 
            …
            return {date: date, total: itemTotal}; // don't push, just return the result
        });
        return Promise.all(promises); // resolves with an array of results
    }); // resolves with that same result array
}
function toArray(forEachable) {
    const arr = [];
    forEachable.forEach(x => { arr.push(x); });
    return arr;
}

  ask by hyperfkcb translate from so

未解决问题?本站智能推荐:

1回复

为什么.then()根本没有为我的Promise执行?

我有一个我想要运行的 Promise 链,当它完成时,我resolve Promise(请参阅下面的代码了解更多上下文),并期望我的.then()块运行......但它没有。 这是我的代码: 上面的函数有效,但是当我用.then()调用它时, .then()块不会运行。 在这个例子中,我从来没有收到
2回复

Promise.all实际上做了什么?

我试图在这里了解 Promise.all。 我在这里所做的是使用 Promise.all 隐藏下面的代码以实现相同的结果。 我知道Promise都结合了data1,data2。 我的问题是 Promise.All 在没有解决方法的情况下如何工作? Promise 是否在方法本身内解析这些数据? 请
1回复

将外循环参数传递给Promise解决方案

我有一个查询数据库的for循环。 我希望数据库调用是异步的。 这是代码的结构: 如您所见,我希望在解析中打印参数idx ( db.query返回Promise)。 但是这种方式会打印错误的idx ,因为在答应解决后idx值会增加。 传递变量idx的正确方法是什么? 谢谢。
1回复

angularjs在app.config中解析

在下面的示例中,我希望logincheck在进入checkBasket之前先解决,因为后者取决于前一个。 不,我不想将代码放在同一个函数中,因为这两个代码在另一条路径中已多次使用。 关于应该如何做的任何建议? 谢谢您的帮助 编辑: 以下是要解决的功能:
2回复

无法解析调用其他方法的Promise

我无法解决创建的 Promise。 不知道问题出在哪里,请帮我解决这个问题。
2回复

q-何时返回,如“defer.resolve(myData);返回defer.promise;”VS只是简单地在Promise链中“返回myData”

我一直在尝试在node.js服务器上编写更好的代码,并且在阅读了类似以下内容的博客文章之后: http://www.codelord.net/2015/09/24/ $ q-dot-defer-youre-doing-it-wrong /(角度特定但概念相同) http://bahm
1回复

如何从then()函数中的Promise访问内容,在下一个then()函数中访问它

如何从 then() 函数中的 Promise 访问内容,在下一个 then() 函数中访问它。 我的问题通过以下代码大致解释。
3回复

在javascript的.then()子句中调用两个Promise

我有一个诺言,当它解决时,它将返回“ ResponseA”,并且在.then()子句中假设要调用另外两个诺言,当它们实现时,它应该打印出值(tgResponse.length和igResponse.length )。 但是问题是,它总是打印最后一个promise的值,而跳过第一个console