我正在尝试使用带有以下代码的javascript上传要解析的文件数组:
HTML:
<fieldset>
<input type="file" name="fileselect" id="fileselect" multiple></input>
<input id="uploadbutton" type="button" value="Upload"> </input>
</fieldset>
JS:
$('#uploadbutton').click(function () {
var fileUploadControl = $("#fileselect")[0];
if (fileUploadControl.files.length > 0) {
var file = fileUploadControl.files[0];
var name = "style.css";
var parseFile = new Parse.File(name, file);
var filesArray = [parseFile];
}
parseFile.save().then(function() {
// The file has been saved to Parse.
}, function(error) {
// The file either could not be read, or could not be saved to Parse.
});
var newStore = new Parse.Object("FileStore");
newStore.set("files", filesArray);
newStore.save();
});
我上传到一个名为FileStore的类,其中包含当前设置为数组的键“files”,我希望拥有一个文件数组。这是上传多个文件进行解析的最佳方法吗?我的代码现在不能正常工作。我的目标是让我的班级中的每个对象都有多个文件。
答案 0 :(得分:1)
小心异步代码。目前,您的代码将遇到竞争条件,因为您在newStore.save()
完成之前致电parseFile.save()
,因此很可能会失败。
处理newStore
的3行应该在parseFile.save()
的成功处理程序中,例如:
parseFile.save().then(function() {
// The file has been saved to Parse.
var newStore = new Parse.Object("FileStore");
newStore.set("files", filesArray);
newStore.save();
}, function(error) {
// The file either could not be read, or could not be saved to Parse.
});
当您保存多个文件时,您需要等待所有文件完成才能完成下一步。您可以将您的承诺链接在一起,以便在Series或Parallel中运行。
对于你想要的东西,Parallel会正常工作:
var fileSavePromises = [];
// assuming some code that creates each file has stored the Parse.File objects in an
// array called "filesToSave" but not yet called save
_.each(filesToSave, function(file) {
fileSavePromises.push(file.save());
});
Parse.Promise.when(fileSavePromises).then(function() {
// all files have saved now, do other stuff here
var newStore = new Parse.Object("FileStore");
newStore.set("files", filesToSave);
newStore.save();
});
答案 1 :(得分:0)
我已经设法在@Timothy代码的帮助下解决了这个问题,编辑后的完整代码:
var fileUploadControl = $("input[type=file]")[0];
var filesToSave = fileUploadControl.files;
var fileSavePromises = [];
// assuming some code that creates each file has stored the Parse.File objects in an
// array called "filesToSave" but not yet called save
_.each(filesToSave, function(file) {
var parseFile = new Parse.File("photo.jpg", file);
fileSavePromises.push(
parseFile.save().then(function() {
// The file has been saved to Parse.
$.post("/i", {
file: {
"__type": "File",
"url": parseFile.url(),
"name": parseFile.name()
}
});
})
);
});
Parse.Promise.when(fileSavePromises).then(function() {
// all files have saved now, do other stuff here
window.location.href = "/";
});