Javascript 在继续之前,检查承诺函数的返回。错误的方法?
背景:我有PHP背景,这是我第一个使用MEAN stack的应用程序 我需要保存一条记录,但在此之前,我必须检查是否有任何记录已保存在数据库中的相同id下。 在PHP中,我会这样做: 一旦用户单击“保存”: 1) 调用函数检查是否已经存在具有该id的条目 2) 如果没有,则调用save函数 在Javascript中,我对承诺等有点困惑 谁能给我点光吗 现在,我正在做以下工作: 在save api中,我调用此函数检查数据库中是否已经存在记录:Javascript 在继续之前,检查承诺函数的返回。错误的方法?,javascript,node.js,mongoose,promise,Javascript,Node.js,Mongoose,Promise,背景:我有PHP背景,这是我第一个使用MEAN stack的应用程序 我需要保存一条记录,但在此之前,我必须检查是否有任何记录已保存在数据库中的相同id下。 在PHP中,我会这样做: 一旦用户单击“保存”: 1) 调用函数检查是否已经存在具有该id的条目 2) 如果没有,则调用save函数 在Javascript中,我对承诺等有点困惑 谁能给我点光吗 现在,我正在做以下工作: 在save api中,我调用此函数检查数据库中是否已经存在记录: recordExists=findtransactio
recordExists=findtransactionbybill(billId)代码>
问题是我认为我没有正确地使用promise,因为我的变量没有填充(因为它是异步的)。
在console.log中,我看到承诺正在实现,但是,变量返回为[object object]
我被这个问题困住了,因为我不知道我是否应该继续以PHP思维方式思考,或者Javascript中是否使用了不同的方法
提前谢谢 我认为正确的功能是:
function findTransactionByBill(billId){
var results = new promise(function(resolve, reject){
Transactions.find({billId : billId},function(err, transactions){
if(err) {
reject(err);
} else {
if (transactions.length === 0) {
reject('No any transaction');
} else {
//console.log(transactions);
resolve(transactions);
}
});
});
results.then(function(data){
console.log('Promise fullfilled: '+ data);
}, function(error){
console.log('Promise rejected: ' + error);
});
return results;
}
然后像这样使用它:
recordExists = findTranscationByBill(billId);
recordExists.then(function() {
// resolved, there are some transactions
}, function() {
// rejected. Error or no any transactions found
// may be you need to check reject result to act differently then no transactions and then error
});
在我看来,您也可以为此使用回调,既然MongoDB有一个count方法,为什么不使用它呢
function findTransactionByBill(billId, callback){
Transactions.count({billId : billId}, function(err, count){
if (err) {
callback(err, false);
} else {
callback(null, count !== 0);
}
});
}
以及如何使用它
findTransactionByBill(billId, function(err, exists) {
if (err) {
// handle errors
} else if ( ! exists ) {
// insert into DB
}
}
我假设您使用的是mongodb本机驱动器
我认为mongodb没有内置的promise支持。因此,您必须通过promise library的一点帮助来实现它。如果你想使用蓝鸟,请参考
承诺后,代码应该如下所示(使用蓝鸟):
上面的代码并不完美,因为它引入了一个全局变量,所以更好的版本可能是
Promise = require('bluebird');
// Promisify...
var client = MongoClient.connectAsync('mongodb://localhost:27017/test')
.then(function(db) {
return Promise.prop({
item: db.collection("myCollection").findOneAsync({ id: 'billId' },
db: db
})
})
.then(function(result) {
var item = result.item;
var db = result.db
if (item)
db.save(item);
})
.catch (err) {
// error handling
}
你需要检查一下,知道如何使用它。它们还有许多其他promise库,如q、when,但都是类似的东西。不客气。记住,承诺是伟大的,它们让你走出了回调的地狱,但同时,简单的旧回调是在Node中完成大多数事情的方式,对于像这样简单方便的方法,它们工作得很好。我不同意,如果你像OP一样使用承诺,承诺永远不会伟大,因为你仍然在做回调(尽管有所有的缺点)但是有附加的仪式。延迟的反模式是真实的。
Promise = require('bluebird');
// Promisify...
var _db = null;
var client = MongoClient.connectAsync('mongodb://localhost:27017/test')
.then(function(db) {
_db = db
return db.collection("myCollection").findOneAsync({ id: 'billId' })
})
.then(function(item) {
if (item)
_db.save(item);
})
.catch (err) {
// error handling
}
Promise = require('bluebird');
// Promisify...
var client = MongoClient.connectAsync('mongodb://localhost:27017/test')
.then(function(db) {
return Promise.prop({
item: db.collection("myCollection").findOneAsync({ id: 'billId' },
db: db
})
})
.then(function(result) {
var item = result.item;
var db = result.db
if (item)
db.save(item);
})
.catch (err) {
// error handling
}