我正在尝试将文件上传到s3存储桶,以下代码用于完成此操作。
var params = {
localFile: "../Processor/1.wav",
s3Params: {
Bucket: "bucketname",
Key: "1.wav",
},
};
var uploader = client.uploadFile(params);
uploader.on('error', function(err) {
console.error("unable to upload:", err.stack);
});
uploader.on('progress', function() {
console.log("progress", uploader.progressMd5Amount,
uploader.progressAmount, uploader.progressTotal);
});
uploader.on('end', function() {
console.log("done uploading");
});
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切正常。现在让我们在这里说,我想从本地路径上载5个文件到s3存储桶,我该如何实现,是否有任何直接方法可以为多个文件上载提供亚马逊,或者我需要使用异步模块?
理论:
我在开始时做了大约100个承诺,然后用它来解决它们Promise.all().
这100个承诺中的每一个依次进行一些异步REST调用,其响应可能主要变化(例如由于网络连接).
解决所有100个承诺的过程大约需要20秒.在此期间,应向用户提供进度的实时反馈,以使他保持参与.
为了实现这些异步操作的进度,我想在客户端使用progressCounter,它的值将在每个promise被解析后立即更新.
事情是,如果progressCounter = 1并且所有这些操作都是异步的,我担心会遇到一种竞争条件,例如,由两个不同的promises检索的progressCounter的当前值可能会被发现为1,因此他们可能会尝试增加progressCounter因为竞争条件,所以最终值不会是3.
实验: 我尝试重现这个理论但不能使用以下内容:
var progress = {};
progress.counter = 1;
var promise1 = new Promise(function(resolve, reject) {
resolve();
});
var promise2 = new Promise(function(resolve, reject) {
resolve();
});
promise1.then(function() {
progress.counter += 1;
});
promise2.then(function() {
progress.counter += 1;
});
setTimeout(function() {
alert(progress.counter); // progress.counter: 3
}, 1000);`
Run Code Online (Sandbox Code Playgroud)
问题: 问题是否可以在上面的理论中描述这样的竞争条件?如果没有,理论有何缺陷?如果是,那么跟踪承诺解决进度的好方法是什么?
我目前有一个坐标列表,我用它来获取附近的徒步旅行。假设我将列表状态更新为新坐标,但先前坐标的提取请求未完成 - 如何取消对先前坐标发出的所有提取请求,而仅根据新坐标调用新的提取请求?
我尝试实现,AbortController但它可能不起作用,因为它没有取消“批量”的获取请求,而只是取消单个获取请求。我的代码如下:
let abortController = new AbortController();
const getNearbyHikes = async (coordinates) => {
abortController.abort();
abortController = new AbortController();
for (const coord of coordinates) {
if (coord) {
try {
const { lat, lng } = cord.coordinates
const response = await fetch(
'http://localhost:5000/category/' + lat + "/" + lng + '/' + searchCategory,
{signal: abortController.signal}
)
const result = await response.json();
setHikes((prevState) => [...prevState, ...result.businesses])
} catch (error) {
if(error.name === 'AbortError'){
return;
}
throw error …Run Code Online (Sandbox Code Playgroud)