我正在做一个项目,在这个项目中,我运行了一系列promise,然后将它们的结果(在.then((部分(推送到一个数组中。问题是,尽管promise本身提供了一个结果值,但实际上并没有将任何内容推送到数组本身。下面是我代码中的create函数,其中我使用Promise.all()
在一个名为newJoinsPromiseArray
的promise数组上运行一系列进程。
export const create = (req, res, next) => {
const newJoinsPromiseArray = []; //This will be an array of the new joins that we are adding
for (const worker of req.body.workers){
const newJoinElement = new JoinTable(null, req.body.contact_id, worker.value) //We use value here since it's in the form that multi-select gave us
newJoinElement.save()
.then((result) => {
newJoinsPromiseArray.push(JoinTable.findByID(result[0].insertId))
})
.catch(err => res.json({message: err}))
}
Promise.all(newJoinsPromiseArray).then((values) => {console.log(values)})
}
所以每当我控制台.log(newJoinsPromiseArray(时,它只打印[]
。我也尝试过在每个元素上运行JoinTable.findByID函数,然后将它返回的内容推送到数组中,尽管我认为这是一样的。
以下是我保存和查找ByID:的功能
save(){
/* The purpose of this function is to save a new element to the database. */
return db.execute(`INSERT INTO workercontacts (contact_id, worker_id) VALUES(?, ?)`, [this.contact_id, this.worker_id]);
}
static findByID(element_id){
// Will give us a specific element based on the id
return db.execute('SELECT * FROM workerContacts WHERE workerContacts.id = ?', [element_id]);
}
我使用的是MySQL数据库,我认为它与这个问题无关,但我想我会添加这些信息以防万一。
编辑:
除此之外,这是我对这项工作的新尝试,但它仍然没有
export const create = async (req, res, next) => {
const newJoinsPromiseArray = []; //This will be an array of the new joins that we are adding
for (const worker of req.body.workers){
const newJoinElement = new JoinTable(null, req.body.contact_id, worker.value) //We use value here since it's in the form that multi-select gave us
try{
const savedResult = await newJoinElement.save();
const joinElementByID = await JoinTable.findByID(savedResult[0].insertId);
newJoinsPromiseArray.concat(joinElementByID);
}
catch (e){
res.json({message: e})
}
}
console.log(newJoinsPromiseArray)
}
不幸的是,我仍然迷路了,但感谢你对我的帮助。
您应该将Promise
推入数组。
newJoinsPromiseArray.push(newJoinElement.save().then(result => JoinTable.findByID(result[0].insertId));
或者,您可以将函数设为async
,并在循环中的每个保存操作上使用await
。
多亏了@Unmitigated,我明白了!我刚把我的创建函数改成这样:
export const create = (req, res, next) => {
const newJoinsPromiseArray = [];
for (const worker of req.body.workers){
const newJoinElement = new JoinTable(null, req.body.contact_id, worker.value) //We use value here since it's in the form that multi-select gave us
newJoinsPromiseArray.push(newJoinElement.save().then(result => JoinTable.findByID(result[0].insertId)))
}
Promise.all(newJoinsPromiseArray).then((values) => res.json(values.map(val => val[0]).flat()))
}