Что я делаю не так с отклонениями Promise здесь? - PullRequest
0 голосов
/ 13 апреля 2019

Итак, я сделал немного кода многократного использования для узла и применяю его через async / await.Хотя я уверен, что при работе с этим у меня возникает много недоразумений ... Но, клянусь, у меня есть один проект, который использует этот код, и он работает, а другой - нет.Я использую request и request-promise.

UrlRequest: function( opts ) {
    return new Promise( (resolve, reject) => {
        request( opts, 
            function(error, request, body) {
                if (error) 
                    reject( {error: true, msg: error} );
                else
                    resolve( {body, request} );
            });
        })
        .catch(err => reject( {error: true, msg: err} ));
    }

Я вполне уверен, что .catch() не так.Но это не ошибка в моем первом проекте.Поэтому я пытаюсь найти правильный способ сделать это.В нескольких статьях, которые я просмотрел, я нашел эту функцию для использования.Я также знаю, что если произойдет какая-либо ошибка (включая этот случай), она выдаст ошибку UnhandledPromiseRejectionWarning.Так как это правильно обрабатывается?

Как я это использую:

(async () => {
var result = await Promise.UrlRequest( {
    url: "...",
    method: "GET",
    headers: DefaultHeaders
    } );

// do stuff with result... 

}) ();

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Поскольку вы уже установили request-promise, вам не нужно создавать Promise, как вы это делаете. Просто используйте его вместо request, тогда вы получите обещание. Что-то похожее на это должно работать:

const request = require('request-promise')

request(opts)
    .then((res) => {
        // Process res...
    })
    .catch((err) => {
        // Handle error...
    });

Вы можете приступить к обертыванию в функции UrlRequest и использовать с async следующим образом:

UrlRequest: async ( opts ) => {
  try {
    const response = await request(opts);
    return response;
  } catch (error) {
    // Handle error
  }
}

В случае, если вы хотите использовать then() и catch(), вы можете сделать это:

UrlRequest: ( opts ) => {
  return request(opts)
            .then(response => response)
            .catch (error) {
              // Handle error
            }
}
1 голос
/ 13 апреля 2019

С request-promise вам не нужно писать собственную Promise оболочку

// make sure you're using the promise version
const request = require('request-promise')

var opts = {
  ...
  resolveWithFullResponse: true    //  <---  <--- to get full response, response.body contains the body
};

// if you dont plan to use UrlRequest as constructor, better name is starting with lowercase: urlRequest, some naming convention
UrlRequest: async function( opts ) {
  let res;
  try {
    res = await request(opts);
  } catch (e) {
    // handle error
    throw e
  }
  return res;
}

Примечание: async функция переносит возврат в Promise

...