数组forEach循环中的承诺

时间:2020-10-04 10:01:48

标签: javascript php arrays foreach promise

我有一个像这样的数组:

var ids = [8372839402, 8392615782, 3677281302];

插入的是ID值。基于此ID,我必须从数据库中获取每个信息。 基本上,我是通过使用位于db.js中的以下函数来获取数据的:

function getdata(get_command) {
  var request = new XMLHttpRequest();
  var params = params + 'command=' + encodeURIComponent(get_command) + '&';

  console.log(params);

  currentpromise = new Promise(function(resolve, reject) {
    request.open('POST', './php/get_data.php', true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.onreadystatechange = function() {
      if (request.readyState === XMLHttpRequest.DONE) {
        if (request.status === 200) {
          var response = JSON.parse(request.response);
          resolve(response);
        }
        else {
          resolve({error: 'Cant connect!'});
        }
      }
    };
    request.send(params);
  });
}      

除了基本在我的main.js中,我还使用以下函数:

var user_id = 'r82h9hfew89hf9983f8d9';
var currentpromise;
var obj = getdata('SELECT username, email FROM users WHERE id=' + user_id);
      currentpromise.then(function(obj) {
        if (obj.data[0] == 'false') {

        }
        else {
           //succesfully go on
        }
      });     

但是当我在数组中使用它时,它将无法工作。首先,我在var currentpromise上有多个promise,或者每次在数组forEach中调用getdata函数都可以覆盖它们。
如何解决我的问题以无错误地遍历整个数组?

ids.forEach(function(id) {
    var obj = getdata('SELECT name FROM data WHERE id=' + id);
      currentpromise.then(function(obj) {
        if (obj.data[0] == 'false') {

        }
        else {
           //succesfully do next step
           var obj = getdata('SELECT version FROM vers WHERE name=' + obj.data[0]['name']);
           currentpromise.then(function(obj) {
             if (obj.data[0] == 'false') {

             }
             else {
               //succesfully finished with one id
             }
           });  
        }
      });  
});    

我不认为这很重要,但是在这里我们有get_data.php:

<?php
include('classes/db.php');

$data = array();
$command = urldecode($_POST['command']);

$result_value = db::query($command);
$data['data'] = $result_value;

// return all our data to an AJAX call
echo json_encode($data, JSON_PRETTY_PRINT);
?>    

编辑:dp.php

<?php

class db {
  private static function connect() {
    //db inf, username, pwd
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=emergencybase;charset=utf8', 'root', '');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    return $pdo;
  }

  public static function query($query, $params = array()) {
    $statement = self::connect()->prepare($query);
    $statement->execute($params);

    if (explode(' ', $query)[0] == 'SELECT') {
      $data = $statement->fetchAll();
      return $data;
    }
  }
}

希望有人可以帮助我。提前谢谢。
菲利普

1 个答案:

答案 0 :(得分:1)

ForEach本质上是同步的,并且您不应该在forEach循环内使用Promise或任何异步代码,因为它会简单地遍历数组,而无需等待诺言得到实现。 您可以改为for await...of循环。