клиент шлюза api aws не выполняет .then, он просто выходит из функции apigClient - PullRequest
0 голосов
/ 20 мая 2018

Это мое первое приложение, использующее AWS API-шлюз, и я смог получить данные, когда функция была вызвана в componentDidMount, теперь я вызываю такой модуль из моего класса компонента

componentDidMount (){
  // debugger
  this.setState({apiData: apiCall(this.state.testSearch) })
this.updateAPIdata()

}

и apiCallэто функция в method.js

const apiCall = function(searchInput) {
  const searchTerm = searchInput
  var apigClientFactory = require('aws-api-gateway-client').default;

  const config =  {
                apiKey: 'xxxxxx',
                invokeUrl:'https://xxxx.execute-api.us-east-2.amazonaws.com'
                }

  var apigClient = apigClientFactory.newClient(config);
  var params = {
        //This is where any header, path, or querystring request params go. The key is the parameter named as defined in the API
        //  userId: '1234',
        search_keyword: 'Ambassador'
      };
      // Template syntax follows url-template https://www.npmjs.com/package/url-template
  var pathTemplate = '/beta/testDB'
  var method = 'GET';
  var additionalParams = {
      //If there are any unmodeled query parameters or headers that need to be sent with the request you can add them here
      headers: {

            },
      queryParams: {
        search_keyword: 'Ambassador'
              }
    }
debugger
    apigClient.invokeApi(params, pathTemplate, method, additionalParams)
             .then(function(result)
                {
                    //This is where you would put a success callback
                    return JSON.parse(result.data)

                }).catch( function(result){
                    //This is where you would put an error callback
                })
}

, когда я отлаживаю код, все правильные переменные передаются в apigClient.invokeApi, но он никогда не переходит к функции then, просто переходит к последнему закрытию} на apiCallфункция.Это неожиданно, так как раньше он отлаживал следующее, как тогда (функция (результат).

Я вызываю функцию неправильно или какую-то другую ошибку новичка? Этот код работал, когда он находился в том же файле .js, что иcomponentDidMount.

1 Ответ

0 голосов
/ 21 мая 2018

Проблема в том, что вы возвращаете свои результаты только после разрешения ответа от вашего API, что происходит асинхронно.

Есть два способа исправить это

  • Использование обратного вызова

`

componentDidMount() {
  apiCall(this.state.testSearch, (data, error) => {
    if (error) {
      //handle
      console.log(error)
      return
    }
    this.setState({apiData: data})
    this.updateAPIdata()
  }
}

const apiCall = function(searchInput, callback) {
  //...Your code
  apigClient.invokeApi(params, pathTemplate, method, additionalParams)
    .then((result) => {
      callback(JSON.parse(result.data))
    })
    .catch((error) => {
      callback(null, error)
    })
}
  • Использование асинхронного ожидания(мой преф)

`

async componentDidMount() {
  try {
    const data = await apiCall(this.state.testSearch)
    this.setState({apiData: data})
    this.updateAPIdata()
  } catch(e) {
    //Handle error
  }
 }

 async function apiCall(searchInput) {
   //...Your code
   const result = await apigClient.invokeApi(params, pathTemplate, method, additionalParams)
   return JSON.parse(result)
 }
...