@Axepec

Node.js, promise, mysql как выдать результат?

Добрый день.... Пытаюсь разобраться с промисами и асинхроностью node.js..
getEmail() {
    let emails = [];
      let result = new Promise( (resolve, reject) => {

        this.start();

        this.db.query('SELECT * FROM contacts', (err, res) => {
          if (!!err) {
            return console.log('Error in the Query');
          } else {

            res.forEach(function (item, i) {
              if ((item.email !== '') && (item.email !== null)) {
                emails.push(item.email);
              }
            });

            resolve( emails );
          }
        });

      });
    
    
    result.then( (result) => {
      this.end();
      console.log('i Work! And I return Result! But i last.....');
      return result;
    });

  }


и при выводе как только не пробовал
let promise = new Promise( (resolve,reject) => {
  let result = _db.getEmail();
  resolve(result);
});

promise.then( (result) => console.log(result) );


Результат выполнения:

undefined
i Work! And I return Result! But i last.....


То есть функция считает что она выполнена, а потом выполняется функция....
  • Вопрос задан
  • 1315 просмотров
Решения вопроса 1
Negezor
@Negezor
Senior Shaurma Developer
Что-то вы совсем намудрили, всё гораздо проще.
getEmail() {
	return new Promise((resolve, reject) => {
		this.start();

		this.db.query('SELECT * FROM contacts', (err, contacts) => {
			if (err) {
				reject(err);

				return;
			}

			const emails = contacts
				.map(contact => contact.email)
				.filter(Boolean);

			this.end();

			resolve(emails);
		});
	});
}

_db.getEmail()
	.then((emails) => {
		console.log(emails)
	})
	.catch((error) => {
		console.log('Error in the Query', error);
	});

По хорошему бы сделать что бы запросы к БД сразу возвращали Promise тогда это станет гораздо удобней.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Coder321
_getEmail() {
    const emails = [];
    return new Promise((resolve, reject) => {
        this.start();
        this.db.query('SELECT * FROM contacts', (err, res) => {
            if (!!err) {
                return reject('Error in the Query');
            } else {
                res.forEach(function (item, i) {
                    if ((item.email !== '') && (item.email !== null)) {
                        emails.push(item.email);
                    }
                });
                this.end();
                return resolve(emails);
            }
        });

    });
}

async getEmail(){
    try {
        const emails = await this._getEmail();
    } catch (error) {
        console.log(error);
    };
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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