Как правильно использовать обещания для возврата массива в конце функции? - PullRequest
0 голосов
/ 02 мая 2020

Я вызываю функцию с намерением вернуть результат после выполнения вызова API. Но это возвращает результат к началу. Что я делаю не так, и как мне это исправить?

(Остальная часть функции работает нормально и выдает результат в консоли, но я не могу заставить его передать его обратно.

Я знаю, что это как-то связано с тем, как я использую обещания, но я часами читал о них, и пока не понял, как там. Поэтому я обращаюсь к вам, ребята.)

Функция:

export function previewStannpSingleCard(card) {
  var requestOptions = {...}
  getSecret("stannp_API")
    .then((secret) => {

        fetch("https://dash.stannp.com/api/v1/postcards/create?api_key=" + secret + "&", requestOptions)
            .then(response => response.json())
                .then(function (result) {
                console.log("json: " + result)
                console.log("pdf: " + result.data.pdf)
                return (result) 
            })

            .catch(error => console.log('error', error));
    })
}

Вот как я вызываю функцию:

export async function preview_click(event) {

let results = await wixData.get("UserCard", "ec9b2675-8b24-446b-a0f9-fc0246a3f35f")
        let preview = await previewStannpSingleCard(results)
        console.log("pdf to use next: " + preview.data.pdf);
        }

Ответы [ 3 ]

2 голосов
/ 02 мая 2020

Вы забыли вернуть результат связанного обещания из функции previewStannpSingleCard.

Вы можете реорганизовать функцию previewStannpSingleCard в функцию async, чтобы она выглядела более синхронно с помощью try/catch и await

Функция async также возвращает результат, заключенный в обещание, поэтому вы можете await при вызове previewStannpSingleCard:

export async function previewStannpSingleCard(card) {
  const requestOptions = {};
  try {
    const secret = await getSecret("stannp_API");
    const response = await fetch("https://dash.stannp.com/api/v1/postcards/create?api_key=" + secret + "&", requestOptions);
    const result = await response.json();
    console.log("json: " + result)
    console.log("pdf: " + result.data.pdf)
    return result;
  } catch (error) {
    console.error('error', error);
    throw error;
  }
}
0 голосов
/ 02 мая 2020

Видя код, вы ничего не возвращаете из функции previewStannpSingleCard. return (result) вернет значение функции обратного вызова блока then в вызове fetch. Вам необходимо передать возвращаемые значения родительскому элементу, а затем вернуть обещание, т.е. getSecret: что-то вроде этого:

export function previewStannpSingleCard(card) {
  var requestOptions = {...}
  return getSecret("stannp_API")
    .then((secret) => {
        return fetch("https://dash.stannp.com/api/v1/postcards/create?api_key=" + secret + "&", requestOptions)
            .then(response => response.json())
                .then(function (result) {
                console.log("json: " + result)
                console.log("pdf: " + result.data.pdf)
                return (result) 
            })
            .catch(error => console.log('error', error));
    })
}
0 голосов
/ 02 мая 2020

вам нужно определить previewStannpSingleCard как asyn c (export async function previewStannSingleCard) и поставить await перед getSecret(...).then(...).fetch(...), чтобы он мог ждать возврата. для более простого решения; Вы можете передать обратный вызов, чтобы установить предварительный просмотр;

export function previewStannpSingleCard(card, callback) {
  var requestOptions = {...}
  getSecret("stannp_API")
   .then((secret) => {
    fetch("https://dash.stannp.com/api/v1/postcards/create?api_key=" + secret + "&", requestOptions)
        .then(response => response.json())
            .then(function (result) {
            console.log("json: " + result)
            console.log("pdf: " + result.data.pdf)
            //return (result) remove this
            callback(result)
        })

        .catch(error => console.log('error', error));
    })
}

, который затем будет называться;

 export async function preview_click(event) {

    let results = await wixData.get("UserCard", "ec9b2675-8b24-446b-a0f9-fc0246a3f35f")
    previewStannpSingleCard(results, function(result){
         preview = result;
    })
    console.log("pdf to use next: " + preview.data.pdf);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...