Как получить доступ к данным из функции (node.js) [duplicate]

Могу я просто добавить; люди всегда предполагают, что это компьютерная проблема, но если вы считаете своими руками (база 10), вы не можете получить (1/3+1/3=2/3)=true, если у вас нет бесконечности, чтобы добавить 0.333 ... в 0.333 ... так, как и с (1/10+2/10)!==3/10 в базе 2, вы обрезаете ее до 0,333 + 0,333 = 0,666 и, вероятно, округлите ее до 0,677, что также будет технически неточным.

Подсчитайте в тройном, а третья не проблема, может быть, какая-то гонка с 15 пальцами на каждой руке спросит, почему ваша десятичная математика была сломана ...

9
задан MM1 6 February 2016 в 22:31
поделиться

2 ответа

Как уже упоминалось в другом ответе, этот код является асинхронным, вы не можете просто вернуть значение, которое вы хотите, по цепочке обратных вызовов (вложенные функции). Вам нужно выставить некоторый интерфейс, который позволяет вам сигнализировать вызывающий код, когда у вас есть требуемое значение (следовательно, вызывать их назад или обратный вызов).

В другом ответе есть пример обратного вызова, но есть альтернативный вариант, безусловно, стоит изучить: обещает .

Вместо функции обратного вызова, которую вы вызываете с желаемыми результатами, модуль возвращает обещание, которое может вводить два состояния, выполняться или отклоняться. Вызывающий код ждет обещания войти в одно из этих двух состояний, при этом вызывающая функция вызывается. Модуль запускает изменение состояния на resolve ing или reject ing. В любом случае, вот пример использования обещаний:

Db1.js:

// db1.js
var MongoClient = require('mongodb').MongoClient;
/*
node.js has native support for promises in recent versions. 
If you are using an older version there are several libraries available: 
bluebird, rsvp, Q. I'll use rsvp here as I'm familiar with it.
*/
var Promise = require('rsvp').Promise;

module.exports = {
  FindinCol1: function() {
    return new Promise(function(resolve, reject) {
      MongoClient.connect('mongodb://localhost:27017/db1', function(err, db) {
        if (err) {
          reject(err);  
        } else {
          resolve(db);
        }        
      }
    }).then(function(db) {
      return new Promise(function(resolve, reject) {
        var collection = db.collection('col1');
        
        collection.find().toArray(function(err, items) {
          if (err) {
            reject(err);
          } else {
            console.log(items);
            resolve(items);
          }          
        });
      });
    });
  }
};


// app.js
var db = require('./db1');
    
db.FindinCol1().then(function(items) {
  console.info('The promise was fulfilled with items!', items);
}, function(err) {
  console.error('The promise was rejected', err, err.stack);
});

Теперь, более актуально версии драйвера node.js mongodb имеют встроенную поддержку обещаний, вам не нужно делать какую-либо работу для обертывания обратных вызовов в обещаниях, как указано выше. Это лучший пример, если вы используете обновленный драйвер:

// db1.js
var MongoClient = require('mongodb').MongoClient;
                       
module.exports = {
  FindinCol1: function() {
    return MongoClient.connect('mongodb://localhost:27017/db1').then(function(db) {
      var collection = db.collection('col1');
      
      return collection.find().toArray();
    }).then(function(items) {
      console.log(items);
      return items;
    });
  }
};


// app.js
var db = require('./db1');
    
db.FindinCol1().then(function(items) {
  console.info('The promise was fulfilled with items!', items);
}, function(err) {
  console.error('The promise was rejected', err, err.stack);
});

Обещания обеспечивают отличный метод для асинхронного потока управления, Я настоятельно рекомендую потратить некоторое время на ознакомление с ними.

18
ответ дан Eric Coutu 26 August 2018 в 12:40
поделиться

Да, это асинхронный код, а с return вы получите объект MongoClient или ничего, на основе того, где вы положили.

Вы должны использовать параметр обратного вызова:

module.exports = {
  FindinCol1 : function funk1(callback) {
    MongoClient.connect("mongodb://localhost:27017/db1", function (err,db) {
      if (err) {
        return console.dir(err);
      }
      var collection = db.collection('col1');
      collection.find().toArray(function (err, items) {
        console.log(items);       
        return callback(items);     
      });
    });
  }
};

Передайте функцию обратного вызова на FindinCol1:

a.FindinCol1(function(items) {
  console.log(items);
});

Предлагаю вам проверить эту статью: https://docs.nodejitsu.com/articles/getting -started / поток управления / что-есть-обратные вызовы

3
ответ дан Festo 26 August 2018 в 12:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: