Javascript 循环内的节点js PROMITE始终打印承诺{<;挂起>;}

Javascript 循环内的节点js PROMITE始终打印承诺{<;挂起>;},javascript,node.js,promise,Javascript,Node.js,Promise,我试图在节点js的for循环中解析一个承诺。在我的代码中,我有一个for循环,在该循环中调用一个函数findincollection,该函数返回一个承诺。然后,我将数据推送到finalresult数组,并在for循环完成后解析它。但我面临的问题是它不能解决完整的数据。在解决所有承诺之前,for循环的执行已经完成。 行console.log(p1)总是打印Promise{},但它最终会得到解决,正如您在p1的代码中看到的那样。然后()语句中,我会一个接一个地获取数据。但是finalresult数组

我试图在节点js的for循环中解析一个承诺。在我的代码中,我有一个for循环,在该循环中调用一个函数
findincollection
,该函数返回一个承诺。然后,我将数据推送到
finalresult
数组,并在for循环完成后解析它。但我面临的问题是它不能解决完整的数据。在解决所有承诺之前,for循环的执行已经完成。 行
console.log(p1)
总是打印Promise{},但它最终会得到解决,正如您在
p1的代码中看到的那样。然后()
语句中,我会一个接一个地获取数据。但是
finalresult
数组解析得太早了。我还想知道为什么我总是得到承诺{},即使承诺最终仍在得到解决。 请查看下面我的代码:

var mob = [123, 456, 789];
var list = [1, 2, 3, 4, 5, 6, 7, 8];
var res = [];
var finalresult = [];
for (y = 0; y < list.length; y++) {
    const p1 = findincollection(list[y], mob, savetofile);
    console.log(p1); //always prints Promise { <pending> } 8 times
    p1.then(function(dt) {
        finalresult.push(dt); //pushes all 3 objects one by one
        console.log(dt); //prints 3 objects one by one
        client.close();
        if (y == (collist.length)) { //check if the loop has reached the last index
            resolve(finalresult); //resolves the finalresult array with 1 object only instead of 3. I want this part to resolve the complete finalresult array i.e with all 3 objects.
        }
    });
}

const findincollection = function(index, mob, save) {
    return new Promise((resolve, reject) => {
        MongoClient.connect(url, function(err, client) {
            assert.equal(null, err);
            const db = client.db(dbName);
            const collection = db.collection(col);
            collection.find({ 'Numbers': { $in: mob } }).toArray(function(err, docs) {
                const c = save(index, docs);
                c.then(function(m) {
                    console.log(m); //print's Saved 3 times as the mob array length is 3
                    client.close();
                    return resolve(res);
                })
            });
        });
    });
}

const save = function(index, data) {
    return new Promise((resolve, reject) => {
        if (data.length > 0) {
            for (var k = 0; k < data.length; k++) {
                res.push(data[k]);
            }
            fs.appendFile('textlogs/' + index + '.txt', data, function(err) {
                if (err) throw err;
                resolve('Saved');
            });
        }
    });
}
var mob=[123456789];
var列表=[1,2,3,4,5,6,7,8];
var-res=[];
var finalresult=[];
对于(y=0;y{
连接(url,函数(err,客户端){
assert.equal(null,err);
const db=client.db(dbName);
const collection=db.collection(列);
collection.find({'Numbers':{$in:mob}).toArray(函数(err,docs){
const c=保存(索引、文档);
c、 然后(函数(m){
console.log(m);//当mob数组长度为3时,打印保存了3倍
client.close();
返回解析(res);
})
});
});
});
}
const save=函数(索引、数据){
返回新承诺((解决、拒绝)=>{
如果(data.length>0){
对于(var k=0;k

我不知道如何让循环等待所有承诺都解决,或者让代码同步,然后只解决
finalresult
数组?我该怎么做?

您需要的是
Promise.all()
。它返回一个新的承诺,一旦所有通过的承诺都得到解决,该承诺就会得到解决

您可以尝试类似的方法:

var promises = [];

for (y = 0; y < list.length; y++) {
    promises.push(findincollection(list[y], mob, savetofile));
}

Promise.all(promises)
   .then(dt => {
       finalresult.push(dt); //pushes all 3 objects one by one
       console.log(dt); //prints 3 objects one by one
       client.close();
       if (y == (collist.length)) { 
           resolve(finalresult);
       }
   }); // <-- this will be raised once all your promises are resolved
var承诺=[];
对于(y=0;y{
finalresult.push(dt);//逐个推送所有3个对象
console.log(dt);//逐个打印3个对象
client.close();
如果(y==(collist.length)){
解决(最终结果);
}

}); // 怎么样
Promise.all()
?它打印挂起,因为它是挂起的?您的代码还假定最后的承诺将得到解决last@sinanspd我尝试了promise.all(),但仍然无法按预期工作。@Jaromanda X您能帮我找出代码的错误吗?将FindCollection(list[y]、mob、savetofile)推到一个数组中,然后promise.all推到该数组中。还有,为什么要多次连接mongodb,为什么不在一开始或服务器启动时连接一次?