Как вернуть Promise из нескольких последовательных асинхронных вызовов?

Есть три функции, каждая из которых последовательно вызывает друг друга и надо вернуть промисом результат работы последней, как это сделать? Сейчас у меня так и не работает:
var firstfunction = function(docs) {
    MongoClient.connect('mongodb://127.0.0.1:27017/snmp', function(err, db) {
      db.collection('collection).find({}), function(err. docs) {
         secondfunction(docs);
       })
})
}
var secondfunction = function(docs) {
return new Promise(function(resolve) {
MongoClient.connect('mongodb://127.0.0.1:27017/snmp', function(err, db) {
      db.collection('collection).find({}), function(err. docs2) {
        resolve(docs2);
       })
})
})
}
  • Вопрос задан
  • 320 просмотров
Пригласить эксперта
Ответы на вопрос 2
dmitrika
@dmitrika
Front-end developer / kinoplan.ru
db.collection('collection).find({}), function(err. docs2) {

Артгументы указывают через запятую в JS

И вероятно поможет
return resolve(docs2);
Ответ написан
Комментировать
@denisei
В документации mongodb указано, что если не указывать коллбэк в MongoClient.connect, то нам автоматически возвращается Promise. Далее, collection.find({}) возвращает курсор, но, если обрабатывать курсор одним из методов и не указывать callback, то опять же можно сразу получить Promise. Вооружившись этим можно попробовать сделать так:
MongoClient.connect('mongodb://127.0.0.1:27017/snmp')
.then(db=>
	db.collection('collection1').find({}).explain()
	.then(explaination=>{
			//делаем что-либо с результатами первого запроса
			//например можно вернуть какие - либо данные:
		return data;
	})
	.then(data=> //если в верхнем then мы вернули некие данные (data) - они передаются сюда
		db.collection('collection2').find({}).explain()
		.then(explaination=>{
				//можно закрыть соединение
				db.close();
				//также делаем что-либо с результатами второго запроса
				//можно скрестить результаты первого запроса (data) и (explaination) и вернуть результат
				return result;
		})
   )
)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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