gpt4 book ai didi

node.js - 来自 forEach 函数的多个 Promise

转载 作者:太空宇宙 更新时间:2023-11-04 01:45:13 25 4
gpt4 key购买 nike

我基本上想要的是循环一个 promise ,以便我可以输出结果和数组。

  var oracle_table = new oracle_driver(tableName);

var promise = new Promise(queryObject, function(resolve, reject) {
oracle_table.query(queryObject, (err, result) => {
if(err){
reject(err);
}
resolve(result);
});
})

Promise.all(vals.forEach((queryObject) => promise(queryObject)))
.then((results) => {
// results expected to be [result, result, result] from var promise
res.status(200).json(results)
})
.catch((err) => {
res.status(500).send(err)
})

oracle_driver是一个连接数据库的类。

tableName 是正在编辑的表的名称。

.query 是一个获取对象、对其进行转换并查询数据库返回结果的函数。下面是.query的代码:

    // query
query(queryObject, callback) {
queryObject = JSON.parse(queryObject) // Make sure that the object is in JSON format
let table = this.tableName; // decaring the name of the table from the constructor
let query = `SELECT * FROM ${table} WHERE `; // declaring the beginning query
// Splitting the data from the object in arrays of there keys and there values
let keys = Object.keys(queryObject);
var values = Object.keys(queryObject).map(function(key) {
return queryObject[key];
});
let frist = true;
// constructing the two new arrays into a string
for (var i = 0; i < keys.length; i++) {
if (!frist) query = query.concat(`AND (${keys[i]} = '${values[i]}')`)
else query = query.concat(`(${keys[i]} = '${values[i]}')`)
frist = false;
}
// Showing the query
console.log('query'+query);
console.log('connecting to db');
// Get a non-pooled connection
oracledb.getConnection(
databaseDetails, // DB connection details
function(err, connection) {
if (err) {
console.error(err.message);
return;
}
connection.execute(query,
{

},
function(err, result) {
if(err) console.error(err.message);
console.log('results from db driver ----');
console.log(result.rows);
callback(err, result.rows); // Callback with db details
doRelease(connection); // close connection
}
);
}
);
}

最佳答案

首先,您需要将您的 Promise 包装到一个函数中,以便您可以向它发送查询。

其次,您需要使用 map 而不是 forEach,因为您需要为 Promise.all 提供 Promise 列表,而不是只需在那里调用您的函数即可。

这是应该有效的最终答案:

var promise = (queryObject) => {
return new Promise((resolve, reject) => {
oracle_table.query(queryObject, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
};

vals = [query1, query2, query3, ...];

Promise.all(vals.map(el => promise(el)))
.then(result => {
console.log('result: ', result);
});

关于node.js - 来自 forEach 函数的多个 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51706051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com