等待在javascript中执行循环
我有一个for循环,它在数据库中创建产品,还希望productsarray被推送到另一个集合中,因此我希望它存储在一个临时数组中,但在执行完整的for循环之前,javascript控件将执行剩余的代码,由于该代码,临时数组是空的。 我需要一些东西,以便javascript控件只有在for循环完全执行后才能转到下一个语句等待在javascript中执行循环,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我有一个for循环,它在数据库中创建产品,还希望productsarray被推送到另一个集合中,因此我希望它存储在一个临时数组中,但在执行完整的for循环之前,javascript控件将执行剩余的代码,由于该代码,临时数组是空的。 我需要一些东西,以便javascript控件只有在for循环完全执行后才能转到下一个语句 for(让i=0;i您需要使用异步设计模式。Promise。所有的似乎都完全符合您的要求,但我不知道您用于mongodb的库是否符合Promise 如果您的库不符合承诺,您可以自
for(让i=0;i您需要使用异步设计模式。Promise。所有的似乎都完全符合您的要求,但我不知道您用于mongodb的库是否符合Promise
如果您的库不符合承诺,您可以自己实现它们
let promiseArray;
for(let i=0;i<productsname.length;i++){
name=productsname[i]
cost=productcost[i]
promiseArray.push(new Promise((resolve,reject) => {
Product.create({name:name,cost:cost},function(err,product) {
if(err) reject(err);
else resolve(product);
})
}));
}
Promise.all(promiseArray).then(yourResultArray => {
// rest of your program goes here
})
let promise数组;
for(设i=0;i{
create({name:name,cost:cost},函数(err,Product){
如果(错误)拒绝(错误);
其他解决方案(产品);
})
}));
}
promiseArray.then(yourResultArray=>{
//剩下的程序都在这里
})
您可以做什么:
首先,您可以为产品创建承诺。创建
new Promise(function(resolve, reject) { ... });
然后,您可以创建一个包含承诺的数组,并从以下各项开始:
Promise.all(promises).then(res => { })
见:和
试试这个:
const promises = [];
for (let i=0; i<productsname.length; i++){
const name = productsname[i];
const cost = productcost[i];
promises.push(
new Promise((resolve, reject) => {
Product.create({name,cost},(err,product) => {
if (err) {
reject(err);
} else {
resolve(product);
}
}):
})
);
}
Promise.all(promises).then(res => {
console.info(res);
// TODO what you want
});
const promises=[];
for(设i=0;i{
Product.create({name,cost},(err,Product)=>{
如果(错误){
拒绝(错误);
}否则{
解决(产品);
}
}):
})
);
}
Promise.all(promises).then(res=>{
控制台信息(res);
//做你想做的事
});
PS:{name:name,cost:cost}缩写:{name,cost}要处理此问题,您可以执行以下操作:
让numCreated=0;
for(设i=0;i如果要创建一个临时数组,只需这样做即可
const procductArray = [];
您的FOR循环
for(let i=0;i<productsname.length;i++){
const newProduct = {
name=productsname[i]
cost=productcost[i]
}
Product.create({name:newProduct.name,cost:newProduct.cost},function(err,product){
productArray.push(newProduct);
})
}
for(让i=0;i您应该使用Promise或async/await同步代码
检查下面的代码以了解等待示例:
(异步函数(){
for(设i=0;i
等待表达式只能在异步函数中使用。上面的代码创建一个异步函数并立即调用它。它被称为IIFE(立即调用的函数表达式)。您也可以创建一个异步函数并在其他地方使用:
异步函数createProductArray(){
for(设i=0;i
恐怕这不是问题所在。问题是productArray.push是在回调中执行的(稍后)-->在for循环(应该使用数组的地方)之后没有填充数组什么是productArray?它将包含所有产品好吗?恐怕您误解了这个问题。这是一个时间问题。异步执行问题。您可以接受以下答案之一。如果这些答案不适用于您,您可以给他们反馈。谢谢,这是一个简单的解决方案