【发布时间】:2014-06-04 14:00:53
【问题描述】:
我试图用 mongodb 查询在 NodeJS 中做承诺。
Mongo 库它的 mongod,我认为它会返回承诺。
这是我的代码:
var dbOrders = mongo(db.serverConfig.name + "/" + db.databaseName, ['orders']);
var dbClients = mongo(db.serverConfig.name + "/" + db.databaseName, ['clients']);
var promise;
if (order.Order.Nif === "") {
var newClient = {
name: order.Order.Asegurado,
ni: order.Order.Nif,//Never used..
address: order.Order.Direccion,
city: order.Order.Poblacion,
province: order.Order.Provincia,
phone: order.Order.Telefonos,
cp: order.Order.CodigoPostal
};
promise = dbClients.clients.insert(newClient).then(function (currentClient) {
log.debug('mondialParser', 'addClient', currentClient);
dbOrders.orders.insert(order.Order).then(function (orderId) {
log.debug('mondialParser', 'addOrder', orderId);
dbClients.clients.update({_id: new ObjectID(currentClient)}, {$push: {dataOrders: orderId}}).then(function () {
log.debug('assignOrder', orderId, currentClient);
});
});
});
Q.fcall(promise);
我正在尝试-> 插入客户端,然后插入订单,然后将订单_id 分配给客户端_id。 我放了log.debug,但我只能看到
log.debug('mondialParser', 'addClient', currentClient);
另一个它没有被调用..为什么?这是诺言的正确用法吗?有没有更好的办法?
编辑:
其他方式:
var parseMondial = function (db, order, log) {
"use strict";
var dbOrders = mongo(db.serverConfig.name + "/" + db.databaseName, ['orders']);
var dbClients = mongo(db.serverConfig.name + "/" + db.databaseName, ['clients']);
if (order.Order.Nif === "") {
var newClient = {
name: order.Order.Asegurado,
ni: order.Order.Nif,//Never used..
address: order.Order.Direccion,
city: order.Order.Poblacion,
province: order.Order.Provincia,
phone: order.Order.Telefonos,
cp: order.Order.CodigoPostal
};
var insertClient = function () {
dbClients.clients.insert(newClient).then(function (result) {
log.debug('mondialParser', 'addClient', result);
return result;
});
};
var insertOrder = function () {
dbOrders.orders.insert(order.Order).then(function(result) {
log.debug('mondialParser', 'addOrder', result);
return result;
});
};
Q.all([insertOrder(), insertClient()]).spread(function (resultOrder, resultClient) {
dbClients.clients.update({_id: new ObjectID(resultClient)}, {$push: {dataOrders: resultOrder}}).then(function () {
log.debug('assignOrder', resultOrder, resultClient);
});
}).done();
}
};
这会执行所有“任务”,但在 w.all resultOrder 和 resultClient 内部是未定义的..
【问题讨论】:
-
Q.fcall(promise);应该做什么?promise是一个承诺,而不是一个函数。 -
我认为这“执行”了承诺,对吗?这是我的第一个承诺使用。
-
不,承诺并不代表您可以“开始”的“任务”。它确实代表任务的结果值,通常会在您启动任务时返回。在你的情况下,这就是你打电话给
insert。 -
mongod,你的意思是this library?
-
@Bergi 是的,我用其他方式编辑了我的问题代码..但失败了。
标签: javascript node.js mongodb promise