我有这个代码,我只得到1 Promise的结果,我通过评论其中一个单独尝试每个,他们实际上解决没有错误,但当他们在一起时,我只得到第一个的结果。
但不是来自Promise.all
,只有Promise中的console.log
被称为
var mongodb = require('mongodb');
var Promise = require('bluebird');
var $ = mongodb.MongoClient.connect('mongodb://nobody:nobody@localhost/dbauth');
$.then(
(db) => {
var pp = [];
pp.push(new Promise(
(resolve, reject) => {
var dbx = db.db('db1');
dbx.authenticate('user1', 'user1').then((x) => {
console.log(x); // true
var o = dbx.stats();
o.then(
(result) => {
console.log(result);
resolve(result);
}
).catch(
(err) => {
reject(err);
}
);
});
}));
pp.push(new Promise(
(resolve, reject) => {
var dbx = db.db('db2');
dbx.authenticate('user2', 'user2').then((x) => {
console.log(x);
var o = dbx.stats();
o.then(
(result) => {
console.log(result);
resolve(result);
}
).catch(
(err) => {
reject(err);
}
);
});
}));
return Promise.all(pp).then(
(res) => {
res.forEach(console.log);
}
).catch(console.log);
}).catch(console.log);
这是什么打印
true // from console.log(x); of promise db1 -> auth successful
true // from console.log(x); of promise db2 -> auth successful
{ db: 'db1',
collections: 2,
views: 0,
objects: 0,
avgObjSize: 0,
dataSize: 0,
storageSize: 8192,
numExtents: 0,
indexes: 2,
indexSize: 8192,
ok: 1 } // from console.log(res) of promise db2
但如果我从两者承诺的代码中删除此部分并调用resolve(x)
o.then(
(result) => {
console.log(result);
resolve(result);
}
).catch(
(err) => {
reject(err);
}
);
为什么实际承诺在Promise.all
之前执行?
我将代码更改为这样,但它也不起作用
var mongodb = require('mongodb');
var Promise = require('bluebird');
var $ = mongodb.MongoClient.connect('mongodb://nobody:nobody@localhost/dbauth');
$.then((db) => {
var db1 = db.db('db1');
var db2 = db1.db('db2');
var p1 = db1.authenticate('user1', 'user2').then((x) => {
return db1.stats();
});
var p2 = db2.authenticate('user2', 'user2').then((x) => {
return db2.stats();
});
return Promise.all([p1,p2]).then(console.log);
}).catch(console.log);
我将我的代码更改为这样,并且它有效! ...但这不是我想要的,我想要的是让两个Promise以异步方式执行
var $ = mongodb.MongoClient.connect('mongodb://nobody:nobody@localhost/dbauth');
$.then((db) => {
var db1 = db.db('db1');
var p1 = db1.authenticate('user1', 'user2').then((x) => {
return db1.stats().then(
(res) => {
console.log(res);
var db2 = db1.db('db2');
return db2.authenticate('user2', 'user2').then((x) => {
return db2.stats();
});
}
);
});
p1.then(console.log);
}).catch(console.log);
它接缝是MongoDB问题吗?
const px = (dbx, user, pass) => {
return dbx.authenticate(user, pass).then((x) => {
return dbx.stats()
});
}
var $ = mongodb.MongoClient.connect('mongodb://nobody:nobody@localhost/dbauth');
$.then((db) => {
Promise.all([
px(db.db('db1'), 'user1', 'user1'),
px(db.db('db2'), 'user2', 'user2')
]).then(console.log);
}).catch(console.log);
答案 0 :(得分:0)
我根本没读过你的问题。但是,这个:
return Promise.all([pp]).then(
(res) => {
res.forEach(console.log);
}
).catch(console.log);
似乎错误因为pp
是一个我相信的数组。意思是:[[whatever is in pp]]
答案 1 :(得分:0)
这是一个MongoDB问题,我们无法运行并发auth
操作