等待在javascript中执行循环

等待在javascript中执行循环,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我有一个for循环,它在数据库中创建产品,还希望productsarray被推送到另一个集合中,因此我希望它存储在一个临时数组中,但在执行完整的for循环之前,javascript控件将执行剩余的代码,由于该代码,临时数组是空的。 我需要一些东西,以便javascript控件只有在for循环完全执行后才能转到下一个语句 for(让i=0;i您需要使用异步设计模式。Promise。所有的似乎都完全符合您的要求,但我不知道您用于mongodb的库是否符合Promise 如果您的库不符合承诺,您可以自

我有一个for循环,它在数据库中创建产品,还希望productsarray被推送到另一个集合中,因此我希望它存储在一个临时数组中,但在执行完整的for循环之前,javascript控件将执行剩余的代码,由于该代码,临时数组是空的。 我需要一些东西,以便javascript控件只有在for循环完全执行后才能转到下一个语句


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?它将包含所有产品好吗?恐怕您误解了这个问题。这是一个时间问题。异步执行问题。您可以接受以下答案之一。如果这些答案不适用于您,您可以给他们反馈。谢谢,这是一个简单的解决方案