Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在继续之前,检查承诺函数的返回。错误的方法?_Javascript_Node.js_Mongoose_Promise - Fatal编程技术网

Javascript 在继续之前,检查承诺函数的返回。错误的方法?

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

背景:我有PHP背景,这是我第一个使用MEAN stack的应用程序

我需要保存一条记录,但在此之前,我必须检查是否有任何记录已保存在数据库中的相同id下。 在PHP中,我会这样做: 一旦用户单击“保存”: 1) 调用函数检查是否已经存在具有该id的条目 2) 如果没有,则调用save函数

在Javascript中,我对承诺等有点困惑

谁能给我点光吗

现在,我正在做以下工作: 在save api中,我调用此函数检查数据库中是否已经存在记录:
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 
    }