我正在尝试在函数中使用 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;
}
正如我在评论中添加的那样,我想同时 运行 redPromise
和 BluePromise
并且在他们从网络接收数据后,将它们添加到数组中。然后 return 那个数组。几乎所有的东西都只在使用 Promise.all
的部分起作用。我不知道在 .then
之后放什么,所以值会被添加到数组中:
Promise.all([redPromise, bluePromise]).then([])
而且我无法弄清楚使用 promise 将什么放入 return 数组。
我从 redPromise
和 bluePromise
得到的案例结果写在函数范围变量中,可以像这样推送到数组:
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。它会回调地狱。使用 babel
和 async-await
或生成器函数可能更好?它将更具可读性
一些问题:
- 您需要 return
red
和 blue
在 then
回调中的值,否则这些承诺将解析为 undefined
.
- 同样,您需要 return
Promise.all
的 return 值
- 您不能同步访问
red
和 blue
,因为它们仍未定义。所以这必须在 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);
});
我的函数使用了 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;
}
正如我在评论中添加的那样,我想同时 运行 redPromise
和 BluePromise
并且在他们从网络接收数据后,将它们添加到数组中。然后 return 那个数组。几乎所有的东西都只在使用 Promise.all
的部分起作用。我不知道在 .then
之后放什么,所以值会被添加到数组中:
Promise.all([redPromise, bluePromise]).then([])
而且我无法弄清楚使用 promise 将什么放入 return 数组。
我从 redPromise
和 bluePromise
得到的案例结果写在函数范围变量中,可以像这样推送到数组:
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。它会回调地狱。使用 babel
和 async-await
或生成器函数可能更好?它将更具可读性
一些问题:
- 您需要 return
red
和blue
在then
回调中的值,否则这些承诺将解析为undefined
. - 同样,您需要 return
Promise.all
的 return 值
- 您不能同步访问
red
和blue
,因为它们仍未定义。所以这必须在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);
});