2017-01-27 6 views
-1

Я пытаюсь предпринять некоторые действия после завершения загрузки нескольких изображений, используя Promise.all.Promise.all() немедленно разрешает

Однако код после then выполняется перед отправкой кода.

Что я здесь смущаю?

submit_all_images({ dispatch, rootState }) { 
    const imageFileArray = rootState.imageStore.imageFileArray 
    var promiseArray = [] 

    for (var imageFile of imageFileArray) { 
     promiseArray.push(dispatch('get_signed_request', imageFile)) 
    } 

    Promise.all(promiseArray) 
     .then(results => { 
     console.log("finished with results: " + results) 
     return dispatch('submit_entire_form') 
     }); 
    }, 
    get_signed_request ({ dispatch, commit, state }, imgFile) { 
    const requestObject = {imageName: imgFile.name, imageType: `${imgFile.type}`} 
    axios.post('http://localhost:3000/sign-s3', requestObject) 
    .then(response => { 
     if (response.body.signedRequest && response.body.awsImageUrl) { 
      const signedRequest = response.body.signedRequest 
      const awsImageUrl = response.body.awsImageUrl 
      dispatch('upload_file', { imgFile, signedRequest, awsImageUrl }) 
     } else { 
      alert('Could not get signed URL.'); 
     } 
    }, error => { 
     console.log("ERROR: " + error) 
    }) 
    }, 

    upload_file ({ dispatch, commit, state}, { imgFile, signedRequest, awsImageUrl }) { 
    axios.put(signedRequest, imgFile, { 
     headers: {'Content-Type': imgFile.type} 
    }).then(response => { 
     console.log('finished uploading file: ' + imgFile.name) 
     commit(types.UPDATE_LICENSE_IMG_URLS, awsImageUrl) 
    }, error => { 
     alert("fail") 
     console.log(error) 
    }) 
    }, 
+0

Это хорошие вопросы , но если вас это интересует, это уже сделано, и он готов к работе. http://imagesloaded.desandro.com/ –

+0

Вы уверены, что '(отправка ('get_signed_request', imageFile)' возвращает обещание? Я бы проверял это во-первых, если вы используете диспетчеры Redux, не возвращайте обещания – finalfreq

+0

Я использую Vuex и уверен, что это так: https://vuex.vuejs.org/en/actions.html – softcode

ответ

1

Я не совсем уверен, так как у меня нет опыта работы с vuex, но я предполагаю, что вы пропустили несколько return заявлений.

get_signed_request({ dispatch, commit, state }, imgFile){ 
    const requestObject = {imageName: imgFile.name, imageType: `${imgFile.type}`} 
    //here 
    return axios.post('http://localhost:3000/sign-s3', requestObject) 
     .then(response => { 
      if (response.body.signedRequest && response.body.awsImageUrl) { 
       const signedRequest = response.body.signedRequest 
       const awsImageUrl = response.body.awsImageUrl 
       //here 
       return dispatch('upload_file', { imgFile, signedRequest, awsImageUrl }) 
      } else { 
       alert('Could not get signed URL.'); 
      } 
     }, error => { 
      console.log("ERROR: " + error) 
     }) 
}, 

upload_file({ dispatch, commit, state}, { imgFile, signedRequest, awsImageUrl }){ 
    //here 
    return axios.put(signedRequest, imgFile, { 
     headers: {'Content-Type': imgFile.type} 
    }).then(response => { 
     console.log('finished uploading file: ' + imgFile.name) 
     //and here 
     return commit(types.UPDATE_LICENSE_IMG_URLS, awsImageUrl) 
    }, error => { 
     alert("fail") 
     console.log(error) 
    }) 
}, 

Так что get_signed_request возвращает обещание, которое устраняет только после того, как axios.post().then() делается, которым зависит от первого решения dispatch('upload_file', ...)

И то же самое для upload_file в зависимости от разрешения axios.put().then() в зависимости от commit(types.UPDATE_LICENSE_IMG_URLS, awsImageUrl)

+0

Да, это сработало. Немного смущен. Должны ли действия с асинхронными задачами всегда возвращать обещания таким образом? Даже когда их называют одними? @Thomas – softcode

+0

@softcode, вы уверены, что их всегда будут называть одними? Даже в будущем? Обетование построено так, что вы его возвращаете или нет. – Thomas

 Смежные вопросы

  • Нет связанных вопросов^_^