我有一个像这样的数组:
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;
}
}
}
希望有人可以帮助我。提前谢谢。
菲利普
答案 0 :(得分:1)
ForEach
本质上是同步的,并且您不应该在forEach
循环内使用Promise或任何异步代码,因为它会简单地遍历数组,而无需等待诺言得到实现。
您可以改为for await...of
循环。