Возвращаемое значение из asyn c function node.js - PullRequest
0 голосов
/ 25 мая 2020

Я знаю, что это наиболее часто задаваемый вопрос в javascript относительно асинхронного поведения функций. Тем не менее я не могу найти рабочее решение для своего варианта использования. Я пытаюсь найти кеш Redis с помощью ключа. Я использую функцию exists, чтобы проверить, присутствует ли ключ. Если присутствует, то я вернусь из кеша, если нет, тогда я установлю ключ, а затем сделаю вызов db, используя этот ключ в качестве параметра db. Это кажется очень простым, но что бы я ни делал, я не могу вернуть значение из кеша или БД. Если я сделаю эти вызовы вне существующей функции, тогда она будет работать как функция распознавателя (решатель графа), как функция asyn c. Эта функция распознавателя ожидает возвращаемого значения. Итак, вот код, по которому я не могу перенастроить значение ни в одном сценарии: -

empId: async(obj, params, ctx, resolverInfo) => {

    await client.exists(obj.empId, async function(err, reply) {
      if (reply == 1) {

        return await getAsync(obj.empId).then(res => {
          console.log(res);
          return res;

        })
      } else {
        return await db.one('SELECT * FROM iuidtest WHERE empid = $1', [obj.empId])
          .then(iuidtest => {
            console.log(iuidtest.empid);
            return iuidtest.empid;
          })

      }
    });

    const doSomethingWith = empid => {

      console.log("empid = ", empid);

    }

Я получаю правильные значения в консоли, но не могу вернуться. Однако, если я напрямую выполняю эти вызовы в своей функции распознавателя, то есть вне функции redis exists, я могу вернуть значение.

empId: async(obj, params, ctx, resolverInfo) => {
    return await getAsync(obj.empId).then(res => {
          console.log(res);
          return res;

Таким образом, я могу вернуть значение из функции резолвера. Было бы очень полезно, если бы кто-нибудь мог предоставить рабочий код для этого вместо других ссылок, касающихся того, как вернуться из функции asyn c с помощью обратных вызовов и обещаний. Вот еще один пост, рег. : - Библиотека Redis asyn c не имеет функций, которые есть в библиотеке redis для node.js Заранее спасибо!

1 Ответ

0 голосов
/ 25 мая 2020

Если client.exists возвращает обещание, тот же код можно записать, как показано ниже:

empId: async (obj, params, ctx, resolverInfo) => {

    const exists = await client.exists(obj.empId);

    if (exists === 1) {
      return getAsync(obj.empId);
    }

    return await db.one('SELECT * FROM iuidtest WHERE empid = $1', [obj.empId])
      .then(iuidtest => {
        return iuidtest.empid;
      });

  }

Если client.exists принимает только обратный вызов, тогда код можно записать как:

empId: async (obj, params, ctx, resolverInfo) => {

    async function empIdExists(empId) {

      return new Promise(function resolver(resolve, reject) {

        client.exists(obj.empId, function(err, reply) {

          if (err) {
            reject(err);
            return;
          }

          if (reply == 1) {
            resolve(1);
            return;
          } else {
            resolve(0);
            return;

          }

        })

      });

    }

    const exists = await empIdExists(obj.empId);

    if (exists === 1) {
      return getAsync(obj.empId);
    }

    return await db.one('SELECT * FROM iuidtest WHERE empid = $1', [obj.empId])
      .then(iuidtest => {
        return iuidtest.empid;
      });

  }

Во второй версии обратите внимание, что я заключил вызов client.exists в функцию asyn c и вызвал его с помощью ключевого слова await.

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