我正在尝试在函数中使用 promise 来接收数据并将它们放入数组然后 return 数组

I am trying to use promise ina function to receive data and put them in array and then return the array

我的函数使用了 promise,但它没有正常工作:

getShirtcolorsCount(){
    var params_red ;
    var red ;
    var params_blue ;
    var blue ;
    var numb = 0 ;
    var docClient = new DynamoDB.DocumentClient();

    // Query voor Shirts 
    params_red = {
        TableName: 'ShirtApp',
        IndexName: 'Shirt-index',
        KeyConditionExpression: 'ShirtC = :sbs AND ShirtQuantity >  :snr ' ,
        ExpressionAttributeValues: {
            ':sbs': 'Red' ,
            ':snr' : numb
        }
    };

    var redPromise = docClient.query(params_red).promise();
    redPromise.then(function(data){
        console.log('Success');  
        red = data.Count;
    }).catch(function(err) {
        console.log(err);
    });

    params_blue = {
        TableName: 'ShirtApp',
        IndexName: 'Shirt-index',
        KeyConditionExpression: 'ShirtC = :sbs AND ShirtQuantity >  :snr ' ,
        ExpressionAttributeValues: {
            ':sbs': 'Blue' ,
            ':snr' : numb
        }
    };

    var bluePromise = docClient.query(params_blue).promise();
    bluePromise.then(function(data){
        console.log('Success');  
        blue = data.Count ;      //NEED THAT to add to the array
    }).catch(function(err) {
        console.log(err);
    });

    var ShirtInfo = [{
        name: 'RedColor',
        value: red
    }, {
        name: 'BlueColor',
        value: blue
    }];

    // **** HERE I NEED HELP what should I PUT in the Promise.all for the array
    // I want redPromise and bluePromise to run at the same time after I receive 
    // data then add then to the array and return the array as the function
    Promise.all([redPromise, bluePromise]).then([ShirtInfo])

    return ShirtInfo;
}

正如我在评论中添加的那样,我想同时 运行 redPromiseBluePromise 并且在他们从网络接收数据后,将它们添加到数组中。然后 return 那个数组。几乎所有的东西都只在使用 Promise.all 的部分起作用。我不知道在 .then 之后放什么,所以值会被添加到数组中:

Promise.all([redPromise, bluePromise]).then([])

而且我无法弄清楚使用 promise 将什么放入 return 数组。

我从 redPromisebluePromise 得到的案例结果写在函数范围变量中,可以像这样推送到数组:

return new Promise(function (resolve, reject) {
  Promise.all([redPromise, bluePromise]).then(function () {
    ShirtInfo.push(red)
    ShirtInfo.push(blue)
    resolve(ShirtInfo)
  })
}

在你调用获取这个数组的函数的地方你也应该使用

getShirtColorsCount().then(function(shirtInfo) {
  // Stuff
})

p.s。它会回调地狱。使用 babelasync-await 或生成器函数可能更好?它将更具可读性

一些问题:

  • 您需要 return redbluethen 回调中的值,否则这些承诺将解析为 undefined.
  • 同样,您需要 return Promise.all
  • 的 return 值
  • 您不能同步访问 redblue,因为它们仍未定义。所以这必须在 then 回调中发生。

我也会避免您的代码重复,并使用您感兴趣的颜色列表,然后循环浏览这些颜色:

getShirtcolorsCount(){
    var params;
    var colors;
    var promises;
    var numb = 0;
    var docClient = new DynamoDB.DocumentClient();

    colors = ['Red', 'Blue']; // <--- make code generic
    promises = colors.map(function (color) {
        // Query voor Shirts 
        var param = {
            TableName: 'ShirtApp',
            IndexName: 'Shirt-index',
            KeyConditionExpression: 'ShirtC = :sbs AND ShirtQuantity > :snr ',
            ExpressionAttributeValues: {
                ':sbs': color, // <-- make it dynamic to avoid code duplication
                ':snr' : numb
            }
        };
        return docClient.query(params_red).promise();
    });

    // Make sure to return the promise    
    return Promise.all(promises).then(function (responses) {
        console.log('Success');  
        var shirtInfo = responses.map(function (data, i) {
            return {
                name: color[i] + 'Color',
                value: data.Count
            };
        });
        return shirtInfo;
    }).catch(function(err) {
        console.log(err);
    });
}

一旦你处理了 promises,你也必须使用结果作为 promises。您不能期望函数同步 return 该值。因此,当您调用 getShirtcolorsCount 时,使用 then 访问结果:

getShirtcolorsCount().then(function (shirtInfo) {
    console.log(shirtInfo);
});