React Native Почему мой код выполняется перед завершением задачи? Promise.all (). Then () асинхронные проблемы - PullRequest
2 голосов
/ 19 января 2020

У меня есть эта настройка, где он проходит через массив и сохраняет его в телефоне, но он открывает googleUrl до того, как все медиа-файлы загружаются. Разве Promise.all () не должен заботиться об этом? Разве это не должно ждать окончания mapMediaArray и .then() остальной части работы?

const mapMediaArray = selectedMedia.map(index => {
  let cleanUrl = `${index.mediaUrl.split('?')[0]}`;
  let extension = cleanUrl.split('.').pop();
  RNFetchBlob.config({
    fileCache: true,
    appendExt: extension,
  })
    .fetch('GET', index.mediaUrl)
    .then(res => {
      CameraRoll.saveToCameraRoll(res.path());
    });
});

Promise.all(mapMediaArray).then(() => {
  Linking.openURL(googleUrl);
});

1 Ответ

0 голосов
/ 20 января 2020

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

const mapMediaArray = selectedMedia.map(index => {
  return new Promise((resolve)=>{
     let cleanUrl = `${index.mediaUrl.split('?')[0]}`;
     let extension = cleanUrl.split('.').pop();
     RNFetchBlob.config({
       fileCache: true,
       appendExt: extension
     })
     .fetch('GET', index.mediaUrl)
     .then(res => {
       CameraRoll.saveToCameraRoll(res.path());
       resolve()
     })
  })
}

Как и в приведенном выше коде, вы должны вернуть обещание, а затем вызвать решение для того, чтобы Promise.all работал правильно.

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