Правильное использование узла util.promisify js - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь использовать util.promisify для преобразования клиента документов AWS функции get в утилиту, основанную на обещаниях.Но, похоже, он не работает должным образом;

// This does not work as expected
const docClient = new AWS.DynamoDB.DocumentClient();
let docClientGet = require('util').promisify(docClient.get);

Однако, когда я делаю обычное преобразование обещаний, как это,

  let docClientGet = function (params) {
    return new Promise((resolve, reject) => {
      docClient.get(params, function (err, data) {
        if (err) {
          return reject(err);
        }

        return resolve(data);
      })
    })
  };

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

await docClientGet(params);

Это работает!.

Интересно, где я ошибаюсь в понимании util.promisify

1 Ответ

0 голосов
/ 28 ноября 2018

Если метод, который вы обещаете, должен быть связан с объектом, на котором он находится (что выглядит так, как в вашем случае, то этот код:

let docClientGet = utils.promisify(docClient.get);

не сохранит связь сdocClient объект. Что происходит, так это то, что обещанный docClient.get() вызывается без значения this, установленного для объекта docClient, и он не может правильно выполнять свою работу.

Вы можете обойти этос этим:

utils.promisify(docClient.get.bind(docClient));

Обещание doc не проясняет это, поскольку использует пример из библиотеки fs, методы которой не должны быть связаны с fsобъект для правильной работы.

PS Довольно необычно помещать библиотеку util в переменную с именем utils. Это может запутать некоторых людей, читающих ваш код.

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