Как ждать, пока функция вернет результат - PullRequest
0 голосов
/ 22 сентября 2019

У нас есть 2 функции:

submitEstateObject = () => {
    // if (!this.state.formIsValid) {
    //   this.setState({ showFieldErrors: true })
    //   console.log(this.state)
    // } else {
    //this.setState({ isLoading: true })

    console.log('Category', this.state.estateForm.category.value)
    console.log('Type', this.state.estateForm.type.value)
    console.log('Params', this.state.estateParams)
    console.log('ContactsAndOwners', this.state.contactsAndOwners)
    console.log('Photos', this.state.photos)
    //Submit photos
    const test = this.uploadPhotos() // WAIT UNTILL FUNC RETURN ARRAY!
    //AFTER TEST WAS DONE RUN CODE BELOW
    console.log('Test', test)
    console.log('Test2')
    //}
  }

В теле моей функции вы можете видеть, что я звоню uploadPhotos.Эта функция должна возвращать массив объектов, и после этого я хочу продолжить выполнение другого кода ниже.Как это сделать?

uploadPhotos = () => {
    if (this.state.photos.length) {
      const photosToSave = this.state.photos.map(photo => {
        const extensionPattern = /(?:\.([^.]+))?$/
        const fileName = photo.value.name
        const fileExtension = extensionPattern.exec(fileName)[1]
        const newFileName = new Date().getTime()
        const fileLocation = storageRef.child('estateObjects/' + newFileName + '.' + fileExtension)

        return new Promise(resolve => {
          fileLocation.put(photo.value).on(
            firebase.storage.TaskEvent.STATE_CHANGED,
            snapshot => {
              //let progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100
            },
            null,
            () => {
              fileLocation.getDownloadURL().then(url => {
                resolve({ url: url, file: newFileName + '.' + fileExtension })
              })
            }
          )
        })
      })
      Promise.all(photosToSave).then(response => {
        return response
      })
    }
  }

Ответы [ 2 ]

2 голосов
/ 22 сентября 2019

Вы хотите использовать Promise.all(promiseArray)

Вместо console.log(photosToSave)

Попробуйте

Promise.all(photosToSave).then(arr => console.log(arr))
                         .catch(err => console.log('Something failed', err)
1 голос
/ 22 сентября 2019

Есть два способа обработки обещаний.Обратным вызовом (разрешением) или возвращением обещания.Я собираюсь обратиться к последнему.

Каждый раз, когда вы возвращаете что-то в обещании, оно будет возвращено в качестве обещания.Поэтому вам нужно обернуть вызовы функций, которые возвращают обещание, в обещание.

ПРИМЕР:

function ajaxCall(url) {
  return return AJAXRequest(url);
}

function getSearch() {
  ajaxCall('http://test.com')  // Calling a function that returns an ajax call.
  .then(function (ajaxResponse) {
    // code that handles ajaxRespons
  });
}

Но в вашем методе uploadPhotos ничего не возвращается.Вам необходимо вернуть свой Promise.all.

  // the equivalent to my ajaxCall example
  uploadPhotos = () => {
    // other code
    return Promise.all(photosToSave) // added 'return' and removed the return statement inside the Promise.all method.
  }

Ответ должен быть обработан как обещание.

// the same as in my getSearch example
const test = this.uploadPhotos()
.then(function (ajaxResponse) {
  //AFTER TEST WAS DONE RUN CODE BELOW
  console.log('Test', ajaxResponse)
});

Подробнее: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

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