在我的Node / Express后端中,我有一个很长(10到15秒)的API调用,用于设置用户帐户。
通过执行简单的fetch('my/api/url')
GET请求从我的前端触发呼叫。
我希望能够向前端/我的用户发送有关请求状态的消息。 (“设置个人资料”,“下载联系人”,“处理数据”等等等)
在我的Express路线中,我(尝试)通过以下方式发送数据:
exports.setupAccount = async () => {
res.write("Getting contacts");
// A bunch of code and async awaits
// and when it's done...
res.write(`Retrieved ${contacts.length} contacts!`);
}
我目前正在尝试理解Mozilla Fetch() API,甚至不确定我是否在正确的位置。
在我的前端(目前仅使用Vanilla JS)中,我正在做
fetch('/my/setup/api')
.then(response => {
const reader = response.body.getReader();
reader.read().then(async ({ done, value }) => {
console.log("VALUE", value); // <== This returns a Uint8Array
var str = String.fromCharCode.apply(null, value);
console.log("Message from API:", str);
})
})
这有效,但只给我从服务器发送的第一 res.write()
,并且不注销后续写入。如何使用此fetch
/ getReader()
方法读取多个流块?
答案 0 :(得分:0)
使用while
和await
循环,找到了适用于香草JS的答案:
fetch('/my/api')
.then(async response => {
const reader = response.body.getReader();
while(true) {
const {done, value} = await reader.read();
// If it's done, there will be no value
if (done) {
console.log("Done!");
break;
}
// value is Uint8Array of the chunk bytes
var str = String.fromCharCode.apply(null, value);
console.log(str)
}
})
答案 1 :(得分:0)
使用response.text()
将读取流以完成操作。我们还可以使用Response
对象来检索其他格式,例如blob(response.blob()
)或json(response.json()
)。
fetch('/my/setup/api')
.then(response => response.text())
.then(text => console.log("Message from API:", text))