等到jquery函数返回值

时间:2018-12-20 09:45:34

标签: jquery file-upload promise blueimp

我正在使用jQuery Blueimp文件上传,并尝试在变量中获取上传的文件json。我称这个函数为:

var fileoutput = attachfile(fileobject, ['xlsx','zip'],"tmp");

这将调用函数:

function attachfile(fileobject, allowedfiletypesarray, destinationfolderpath) {
    var allowedFileTypes; 
    allowedFileTypes = allowedfiletypesarray.join('|');
    allowedFileTypes = "/\.("+allowedFileTypes+")$/i";

    $(fileobject).fileupload({
        add: function(e, data) {        
            if(data.originalFiles[0]['type'].length && !allowedFileTypes.test(data.originalFiles[0]['type'])) { 
                $('#fileerror').html('Not an accepted file type'); // show error message
                return false;
            } 
            data.submit();
        },
        url: "uploadcsv.php", 
        dataType: 'text',
        acceptFileTypes : allowedFileTypes,
        formData: {"upload_url":destinationfolderpath},
        done: function (e, data) {
            var fileuploadresult = data.result;
            fileuploadresult = JSON.parse(fileuploadresult); 
            console.log(fileuploadresult);
            return fileuploadresult;
        },
    }).prop('disabled', !$.support.fileInput)
        .parent().addClass($.support.fileInput ? undefined : 'disabled');   
}

现在的问题是,

var fileoutput = attachfile(fileobject, ['xlsx','zip'],"tmp");
console.log(fileoutput);

这将返回undefined。而且我没有从attachfile()获得回报。 console.log(fileuploadresult);中的attachfile()正在正确打印上传的文件详细信息。

所以我尝试添加诸如以下的承诺:

function promisefunction() {
  return new Promise(function (resolve, reject) {
    resolve( attachfile(fileobject, ['xlsx','zip'],'tmp') );
  });
}

promisefunction()
.then(value => {
    console.log("value : "+value);
})
.catch(err =>{
    // handle error
});

但这在文件上传之前也返回未定义的结果。

谁能帮我解决这个问题。预先感谢。

1 个答案:

答案 0 :(得分:1)

问题是因为您返回的Promise与blueimp发出的AJAX请求无关。

达到要求的最简单方法是为您的attachfile()调用提供一个回调函数,然后在done()中调用该函数,如下所示:

var fileoutput = attachfile(fileobject, ['xlsx', 'zip'], 'tmp', function(value) {
  console.log('value : ' + value); 
});

function attachfile(fileobject, allowedfiletypesarray, destinationfolderpath, callback) {
  var allowedFileTypes = "/\.(" + allowedFileTypes + ")$/i";

  $(fileobject).fileupload({
    add: function(e, data) {
      if (data.originalFiles[0]['type'].length && !allowedFileTypes.test(data.originalFiles[0]['type'])) {
        $('#fileerror').html('Not an accepted file type');
        return false;
      }
      data.submit();
    },
    url: "uploadcsv.php",
    dataType: 'text',
    acceptFileTypes: allowedFileTypes,
    formData: {
      "upload_url": destinationfolderpath
    },
    done: function(e, data) {
      var fileuploadresult = JSON.parse(data.result);
      callback && callback(fileuploadresult); // invoke the callback here
    },
  }).prop('disabled', !$.support.fileInput).parent().addClass($.support.fileInput ? undefined : 'disabled');
}