Используя опору из обещания - PullRequest
1 голос
/ 24 сентября 2019

Мне нужно вернуть «r», когда обещание будет выполнено, но проблема в том, что я не могу получить доступ к этому реквизиту со второго момента.Любой вариант?

Проблема в строке 9, я не могу получить доступ к r, но мне нужно это вернуть.Если положить возврат внутрь первого r, я получил undefined.

export async function FilmAPI(title) {
  if (Object.keys(title).length === 0) return null;
  var newTitle = title.split(/[ ]+/).join("+");

  const url = `films/?search=${newTitle}`;
  await api.get(url)
    .then(r => {
    console.log("TCL: FilmAPI -> r", r)
  }).then((response => {
    return r;
  }))
    .catch(error => {
    console.log(error)
  })

}

Вот где я беру возвращаемое значение из FilmAPI

    export function searchNewFilmAction(title) {
  return async dispatch => {
    dispatch(newSearch());
    console.log(FilmAPI(title))
  };
}

Ответы [ 5 ]

1 голос
/ 24 сентября 2019

Попробуйте с:

export async function FilmAPI(title) {
  if (Object.keys(title).length === 0) return null;
  var newTitle = title.split(/[ ]+/).join("+");

  try {
    const url = `films/?search=${newTitle}`;
    const r = await api.get(url);
    console.log("TCL: FilmAPI -> r", r);
    return r;
  } catch(error ) {
    console.log(error)
  }
}
0 голосов
/ 24 сентября 2019

Это решит проблему

export function searchNewFilmAction(title) {
  return async dispatch => {
    dispatch(newSearch());

    FilmAPI(title).then(response => {
      dispatch(newSearchSuccess(response.data.results));
    })
  };
}


export async function FilmAPI(title) {
  if (Object.keys(title).length === 0) return null;
  var newTitle = title.split(/[ ]+/).join("+");

  try {
    const url = `films/?search=${newTitle}`;
    const r = await api.get(url);
    console.log("TCL: FilmAPI -> r", r);
    return r;
  } catch(error ) {
    console.log(error)
  }
}
0 голосов
/ 24 сентября 2019

Просто верните ответ в первом, а затем получите его в качестве параметра во втором:

class api {
  static get(_) {
    return new Promise((resolve,reject) => {
      setTimeout(() => resolve('resolved'), 1000);
    });
  }
}

async function FilmAPI(title) {
  if (Object.keys(title).length === 0) return null;
  var newTitle = title.split(/[ ]+/).join("+");

  const url = `films/?search=${newTitle}`;

  await api.get(url)
    .then(r => {
      console.log("r 1st then", r)
      return r;
    }).then(response => {
      console.log('r 2nd then: ' + response);
      return response;
    }).catch(error => {
      console.log(error)
    })
}

let f = FilmAPI('SOME TITLE');
0 голосов
/ 24 сентября 2019

Сыворотка использовать затем для доступа к элементу и сделать что-то для данных, которые поступают

export async function FilmAPI(title) {
  if (Object.keys(title).length === 0) return null;
  var newTitle = title.split(/[ ]+/).join("+");

  const url = `films/?search=${newTitle}`;
try{
   let r=await api.get(url);
console.log('TCL: FilmAPI -> r', r );


    return r;}

    catch(error)  {
    console.log(error)
  }

}
0 голосов
/ 24 сентября 2019

Ну, вы используете await, поэтому не используйте then и не используйте catch, а попробуйте перехватить

Так что переписайте свой код как:

try {
  const r = await api.get(url);
  console.log('TCL: FilmAPI -> r', r );
  return r;
}
catch (ex) {
  console.Log( ex );
}

Вы можете найти более подробную информацию об обработке ошибок здесь , но в основном, когда вы ожидаете, вы должны использовать вместо этого попытку catch, если вы просто используете асинхронную функцию, вы должны использовать обычный рабочий процессс catch() и then()

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