Возвратите объект в асинхронном режиме и ожидайте в nodejs - PullRequest
0 голосов
/ 21 октября 2018

Я новичок в Node.js, у меня есть async метод с именем

async function makeLineStringFromPoints(user) {
    ...

    for (let item of linesGeoJson) {
        saveLineIntoDb({
            'line': item,
            'date': user.date_created,
            'user_id': user.uid,
            'device_id': user.devid,
        }).then((userStored) => {
            console.log(userStored); // i received undefined  
        }).catch((err) => {
            console.log(err);
        });
    }
    ...
}

, в этом методе у меня есть другой асинхронный метод saveLineIntoDb, в этом методе я храню информацию о пользователе в базе данных:

async function saveLineIntoDb(user) {
    let userStored = user;
    try {
        await db.result(pgp.helpers.insert(user, cs))
            .then(data => {
                return await (user); // return user
            });
    } catch (error) {
        logger.error('saveIntoDatabase Error:', error);
    }
}

Теперь после сохранения я хочу вернуть user в saveLineIntoDb(user) в }).then((userStored), но всегда получаю undefined.

Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 21 октября 2018

Почему вы возвращаете пользователя в то время?Может быть, можно сделать таким образом

async function saveLineIntoDb(user) {
    let userStored = user;
    try {
        await db.result(pgp.helpers.insert(user, cs));

        return user; // return user

    } catch (error) {
        logger.error('saveIntoDatabase Error:', error);
    }
}
0 голосов
/ 21 октября 2018

saveLineIntoDb не возвращает результат и смешивает async и необработанные обещания.Это также предотвращает обработку ошибок в функции вызывающей стороны.return await (user) является чрезмерным, оно также не будет работать, потому что это происходит внутри обычной функции.

Это должно быть:

async function saveLineIntoDb(user) {
   await db.result(pgp.helpers.insert(user, cs));
   return user;
}

Хотя функция вызывающего абонента не связывает обещания и не делаетиспользовать await.Если запросы к БД должны выполняться последовательно, это должно быть:

async function makeLineStringFromPoints(user) {
  ...
  try {
    for (let item of linesGeoJson) {
      const userStored = await saveLineIntoDb(...);
      console.log(userStored);
    }
  } catch (err) {
    console.log(err);
  }
}

Если запросы к БД должны выполняться параллельно, это должно быть:

async function makeLineStringFromPoints(user) {
  ...
  try {
    await Promise.all(linesGeoJson.map(async (item) => {
      const userStored = await saveLineIntoDb(...));
      console.log(userStored);
    }));
  } catch (err) {
    console.log(err);
  }
}
0 голосов
/ 21 октября 2018

В методе saveLineIntoDb попробуйте вернуть результат await:

async function saveLineIntoDb(user) {
    let userStored = user;
    try {
        return await db.result(pgp.helpers.insert(user, cs))
            .then(data => {
                return await (user); // return user
            });
    } catch (error) {
        logger.error('saveIntoDatabase Error:', error);
    }
}

(эта функция вам не нужна async/await)

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