Не включать в обещание, когда архив не определен - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть этот код, чтобы проверить, являются ли архивы неопределенными, но таким образом я просто проверяю, являются ли ВСЕ архивы неопределенными, я хочу проверить, является ли каждый архив неопределенным.

var render_archive1 = jQuery('#archive-pratica1')[0].files[0];
var render_archive2 = jQuery('#archive-pratica2')[0].files[0];
var render_archive3 = jQuery('#archive-pratica3')[0].files[0];
var render_archive4 = jQuery('#archive-pratica4')[0].files[0];


if (render_archive1 !== undefined && render_archive2 !== undefined && render_archive3 !== undefined && render_archive4 !== undefined) {
    // wait till file gets encoded
    Promise.all([getBase64(render_archive1), getBase64(render_archive2), getBase64(render_archive3), getBase64(render_archive4)]).then(([data, data1, data2, data3]) => {
        // push file data
        form.push({'name': 'archive_pratica1', 'value': data});
        form.push({'name': 'archive_pratica2', 'value': data1});
        form.push({'name': 'archive_pratica3', 'value': data2});
        form.push({'name': 'archive_pratica4', 'value': data3});

        // send request
        jQuery.ajax ({
            type: "POST",
            data: {
                action: 'sendEditInfo',
                form: form
            },
            url: '../wp-admin/admin-ajax.php'
        })

        .then((res) => {

        }, err => {

        });
    })
}

Когда архив не определен, я не могу отправить ajax-запрос, потому что ir возвращает ошибку в функции getBase64. Итак, мне нужно создать if, чтобы проверить, когда каждый из них не определен.

функция getBase64

function getBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = error => reject(error);
  });
}

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Не отклоняйте свои обещания, если они не определены

function getBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = error => resolve({error:error});
  });
}

тогда вы проверяете, есть ли в результате ошибка

 if(!data.error)
 form.push({'name': 'archive_pratica1', 'value': data});
0 голосов
/ 08 ноября 2018

Вы можете сделать этот рефакторинг для архивирования этой задачи:

function readArchive(archiveId) {
  var renderArchive = jQuery(`#${archiveId}`)[0].files[0];
  if (renderArchive) {
    return getBase64(renderArchive)
      .then(data => ({ name: archiveId, data }));
  }
  return Promise.resolve(null);
}

Promise.all([
  readArchive('archive-pratica1'),
  readArchive('archive-pratica2'),
  readArchive('archive-pratica3'),
  readArchive('archive-pratica4'),
])
  .then((archives) => {
    archives
      .filter(_ => _ !== null)
      .forEach(_ => form.push({ 'name': _.name, 'value': _.data }));

    // send request
    jQuery.ajax({
      type: "POST",
      data: {
        action: 'sendEditInfo',
        form: form
      },
      url: '../wp-admin/admin-ajax.php'
    })
  })
  .catch((err) => {
    // do something
  });
0 голосов
/ 08 ноября 2018

Если вы хотите делать запросы только для тех, кто не определен, попробуйте что-то вроде этого:

var promises = [];

for(var i = 1; i <= 4: i++) {
  renderArchive = jQuery('#archive-pratica' + i)[0].files[0];
  
  if (renderArchive !== undefined) {
    var p = getBase64(renderArchive).then((data) => {
      form.push({'name': 'archive_pratica' + i, 'value': data});
    });
    
    promises.push(p);
  }
}

Promise.all(promises).then(() => {
  jQuery.ajax ({
    type: "POST",
    data: {
        action: 'sendEditInfo',
        form: form
    },
    url: '../wp-admin/admin-ajax.php'
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...