当我在我的应用程序(前端)中调用函数时,我想基本上这样做:
- 上传文件.更新用户界面中的进度百分比.
- 在用户界面中创建作业(job),返回作业(job)已启动.
- 轮询作业(job)并等待其完成.
- 返回响应(本例中为转换后的文件).
用户界面基本上将经历以下顺序:
- 正在上传...(带百分比圆圈更新)
- 被...
- 正在处理中...
- 完成
所有这些都来自于调用一个函数.
该功能将使用XMLHttpRequest
上载进度功能,如here.然后,它将使用fetch
在后端轮询以获取作业(job)状态.最后,当作业(job)返回"完成"时,它将获取并返回转换后的文件.
使用基于promise (非事件emits 器)的方法来实现这一点的正确方式是什么?发电机?
async function *performUploadJob() {
const workId = yield await upload(getFile())
yield { type: 'processing' }
const output = await pollForJob完成(workId)
yield { type: 'result', output }
}
async function pollForJob完成(workId) {
while (true) {
const res = await fetch(`/work/${workId}`)
const json = await res.json()
if (json.status === 'complete') {
return json.output
}
await wait(2000)
}
}
function *upload(file) {
var fd = new FormData();
fd.append("file", file);
var xhr = new XMLHttpRequest();
xhr.open("POST", "/upload", true);
xhr.upload.onprogress = function(e) {
var percent完成 = Math.ceil((e.loaded / e.total) * 100);
yield { type: 'update', percent完成 }
};
xhr.onload = function() {
if(this.status == 200) {
yield { type: 'update', percent完成: 100 }
}
}
xhr.send(fd);
}
这样的事情可能吗(伪代码)?
如果是这样的话,你会如何构建它?如果不是,你会怎么做呢?
我们的目标是能够做这样的事情:
const iterator = performUploadJob()
for (const data of iterator) {
switch (data.type) {
...
}
}