未定义存档时不要包含在Promise中

时间:2018-11-08 11:25:12

标签: javascript jquery promise

我有这段代码可以验证档案是否未定义,但是通过这种方式,我只需要验证所有档案是否都未定义,就可以验证每个档案是否都未定义。

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 :(得分:2)

如果承诺没有定义,请不要拒绝

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});

答案 1 :(得分:2)

您可以执行此重构以存档此任务:

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
  });

答案 2 :(得分:1)

如果您只想对未定义的请求,请尝试以下操作:

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'
  });
});