Это правильный способ справиться с обещанием JavaScript? - PullRequest
0 голосов
/ 05 апреля 2020

Простите, но я новичок в JS обещаниях. Я думаю, что мне нужно использовать один для взаимодействия со службой AWS, которая записывает и извлекает данные из DynamoDB. У меня есть приложение JavaScript, которое запускается плагином Serverless npm, который определяет экспортируемые функции как конечные точки. В этих конечных точках после выполнения обещания мне нужно отправить данные обратно в конечную точку, чтобы представить их как тело JSON. См. Код ниже.

exports.getBlog = async (event) => {
    return getBlogPost(event).then((data) => {
        console.log("worked", data);
        var response =  {
            statusCode: 200,
            body: JSON.stringify(data)
        };

        return response;
    })
    .catch((error) => {
        console.log("didn't work");
        var response = {
            statusCode: 400,
            body: JSON.stringify(error.toString())
        };

        return response;
    });
}

Что заставляет меня думать, что это неправильно, так это то, что мне нужно создать var response и вернуть его, а затем снова вернуться за пределы этого значения в root из * 1005. *. Это правильно? Это заставляет JSON печатать правильно, но я не совсем понимаю, читают ли он-лайн учебники, является ли это хорошей практикой?

Если нет, как бы вы вернули данные из обещания и выставили их как результат JSON ?

В этом примере серверная инфраструктура ссылается на exports.getBlog как конечную точку, например: -

functions:
  get-blog:
    handler: api/blog.getBlog
    events:
      - http:
          path: api/v1/blog
          method: GET
          cors: true

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Существует два основных метода написания обещания: сначала с использованием функций разрешения и отклонения, а затем с использованием функций .then и .catch.

Первый пример:

let promise = new Promise(function(resolve, reject) {
  setTimeout(() => reject(new Error("Whoops!")), 1000);
});

// reject runs the second function in .then
promise.then(
  result => alert(result), // doesn't run
  error => alert(error) // shows "Error: Whoops!" after 1 second
);

Второй пример:

Если нас интересуют только успешные завершения, мы можем предоставить только один аргумент функции для .then:

let promise = new Promise(resolve => {
  setTimeout(() => resolve("done!"), 1000);
});

promise.then(alert); // shows "done!" after 1 second

Если нас интересуют только ошибки, мы можем использовать нулевой в качестве первого аргумента: .then (null, errorHandlingFunction). Или мы можем использовать .catch (errorHandlingFunction), которая точно такая же:

let promise = new Promise((resolve, reject) => {
  setTimeout(() => reject(new Error("Whoops!")), 1000);
});

// .catch(f) is the same as promise.then(null, f)
promise.catch(alert); // shows "Error: Whoops!" after 1 second
1 голос
/ 05 апреля 2020

Вы смешиваете два. Вот с async / await

 exports.getBlog = async (event) => {
 try {
    var res = await getBlogPost(event);
    var data = res.data;
    console.log("worked", data);
    var response =  {
        statusCode: 200,
        body: JSON.stringify(data)
    };

    return response;
} catch(error) {
    console.log("didn't work");
    var response = {
        statusCode: 400,
        body: JSON.stringify(error.toString())
    };

    return response;
   }
}

и без

exports.getBlog = event => {
    return getBlogPost(event).then((data) => {
    console.log("worked", data);
    var response =  {
        statusCode: 200,
        body: JSON.stringify(data)
    };

    return response;
})
.catch((error) => {
    console.log("didn't work");
    var response = {
        statusCode: 400,
        body: JSON.stringify(error.toString())
    };

    return response;
});
}

Хорошее чтение: https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9

РЕДАКТИРОВАТЬ: добавление Статья MDN об асинхронности / ожидании и о том, как с ее помощью можно переписать код обещания

...