在继续之前如何等待所有承诺得到解决

时间:2018-01-26 22:30:24

标签: javascript async-await

我有这段代码

     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);回复客户端之前,如何确保所有承诺都已完成?

4 个答案:

答案 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"; } } ?>

之外执行