我有这段代码
async function concurrent() {
await Promise.all([
getColorCount('black'),
getColorCount('purple'),
getColorCount('red'),
getColorCount('amber'),
getColorCount('yellow'),
getColorCount('white'),
buildChartData()
]);
}
concurrent();
res.json(chartData); //This is run before above promises are complete
我的理解是异步等待暂停代码直到完成,但在这种情况下,res.json(chartData)在上述承诺完成之前运行。
在使用res.json(chartData);
回复客户端之前,如何确保所有承诺都已完成?
答案 0 :(得分:2)
return
来自该函数的值,或在.then()
函数调用中使用concurrent()
function concurrent() {
return Promise.all([
getColorCount('black'),
getColorCount('purple'),
getColorCount('red'),
getColorCount('amber'),
getColorCount('yellow'),
getColorCount('white'),
buildChartData()
]);
}
concurrent()
.then(chartData =>
res.json(chartData)
)
.catch(err => console.error(err));
async function concurrent() {
const promises = await Promise.all([
getColorCount('black'),
getColorCount('purple'),
getColorCount('red'),
getColorCount('amber'),
getColorCount('yellow'),
getColorCount('white'),
buildChartData()
]);
return promises;
}
concurrent()
.then(chartData =>
res.json(chartData)
)
.catch(err => console.error(err));
答案 1 :(得分:1)
使用
concurrent().then(promiseResult => {
res.json(chartData);
});
异步函数总是返回一个promise,因此使用"然后",您可以确保以同步方式完成异步函数。
答案 2 :(得分:1)
在promise.all之后你需要.then
。然后将返回函数调用返回的值数组,以便最初调用它们。
Promise.all([
getColorCount('black'),
getColorCount('purple'),
getColorCount('red'),
getColorCount('amber'),
getColorCount('yellow'),
getColorCount('white'),
buildChartData()
])
.then( function( responeses ) { console.log ( responses )};
看看响应数组,它应该全部落实到位
答案 3 :(得分:1)
async
是一个异步函数,正如您使用关键字res.json
指示的那样。这就是为什么await concurrent();
res.json(chartData);
在调用并发之后执行而不等待的原因。
你可以试着像这样使用等待:
then
但是它会引发错误,因为await不能在异步上下文之外使用。
不幸的是,您需要传统的 concurrent().then(() => {
res.json(chartData);
});
来履行承诺:
buildChartData
除此之外,Promimse.all
是否异步?也许它应该在<?php
include("connect.php");
if(isset($_POST['submit'])){
$username=$_POST['username'];
$password=$_POST['password'];
//Protect MySQL Injection
$username=stripcslashes($username);
$username=mysqli_real_escape_string($username);
$username=htmlspecialchars($username);
$password=stripcslashes($password);
$password=mysqli_real_escape_string($password);
$password=htmlspecialchars($password);
//Run Query to Database
$sql="SELECT * FROM officers WHERE username='$username' AND password='$password'";
$result=mysqli_query($sql);
//Counting Numbers of MySQL row [if user Found row must be 1]
$row=mysqli_num_rows($result);
//Fetching User Informaiton from Database
$userinfo=mysqli_fetch_assoc($result);
$role=$userinfo['role'];
if($row==1){
//Initilizing SESSION with Differents user Role
$_SESSION['login_user']=$username;
$_SESSION['role']=$role;
if($role=='admin'){
header('location:admin.php');
}
if($role=='user'){
header('location:user.php');
}
}else{
echo "No User Found by Given Information";
}
}
?>