gpt4 book ai didi

javascript - 基于WinJS Promise的文件上传队列

转载 作者:行者123 更新时间:2023-12-03 11:16:27 25 4
gpt4 key购买 nike

场景

我需要一个后台上传队列来将文件发送到服务器。队列应按文件被插入队列 (FIFO) 的顺序发送文件。

我的解决方案

var pendingFiles = [];
var filesOperation = null;

uploadNextAsync = function(file) {
var next;
if (!pendingFiles.length) {
return WinJS.Promise.as();
}
next = pendingFiles.shift();
fileslogger.debug("Uploading " + next);
return fileQuery.folder.getFileAsync(next).then(function(file) {
return Server.sendFileAsync(file).then(function() {
return filesOk += 1;
}, function(error) {
filesNok += 1;
return logger.error(error.message, error);
}).then(function() {
if (pendingFiles.length) {
return uploadNextAsync(inspection);
}
});
});
};

createTaskForFile = function(file) {
if (pendingFiles.length == 0) {
pendingFiles = [file.name]
filesOperation = uploadNextAsync(file);
} else {
pendingFiles.push(file.name);
return filesOperation.then(function() {
return uploadNextAsync(file);
});
}
};

问题

有时,如果连续快速调用 createTaskForFile,那么最终会同时上传 2 个文件。那么,在 createTastForFile 函数中如何使用 fileOperation.then 构造或 uploadNextAsync 内部出现了一些问题?

最佳答案

您的问题是 pendingFiles 始终为空。在 createTaskForFile 中,您可以将其设置为单元素数组,但立即调用 uploadNextAsync() 将其移出。我想如果您在文件上传后移动文件,您的脚本可能会起作用。

但是,您实际上并不需要这个数组。您只需将操作排队到 filesOperation 即可,这将是代表所有当前文件上传的 promise 。

var filesOperation = WinJS.Promise.as();
function createTaskForFile(file) {
return filesOperation = filesOperation.then(function() {
return uploadNextAsync(file);
});
}

function uploadAsync(next) {
fileslogger.debug("Uploading " + next.name);
return fileQuery.folder.getFileAsync(next.name).then(function(file) {
return Server.sendFileAsync(file);
}).then(function() {
return filesOk += 1;
}, function(error) {
filesNok += 1;
return logger.error(error.message, error);
});
}

关于javascript - 基于WinJS Promise的文件上传队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27318238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com