我有一個異步方法,它在回圈中呼叫幾個呼叫(等待承諾......),并最終回傳一個結果。當我從該函式獲得結果時,我會向客戶端發送回回應。我要做的是在行程/回圈的中間回傳一個回應,同時回圈繼續運行。當然它打破了回圈,因為它從回圈中間的函式回傳。
這是一段代碼來演示。
app.post('/test', async (req, res)=>{
const body = JSON.stringify(req.body)
await doSomething()
res.status(200).send("ok");
});
const doSomething = async () => {
let times = 0;
for(let i=0 ; i<5 ; i ){
console.log(i)
await delay(1000);
if(i==2){
return 2;
}
}
return times;
}
const delay = async (ms) => {
return await new Promise(resolve => setTimeout(resolve, ms));
}
當我得到 i==2 時,我想回傳一個值并回應客戶端,但我仍然希望回圈運行到最后。我想使用一些負責回傳回應的觀察者(比如 rxjs、事件發射器等)。不確定針對這種不同情況的最佳做法是什么。
感謝您的任何建議。
uj5u.com熱心網友回復:
解決方案是使用同步函式并回傳一個Promise. 但是 AFAIK 將回呼傳遞給 Promise 建構式異步將不起作用:
const doSomething = () => {
let times = 0;
return new Promise(async (resolveMain) => {
for(let i=0 ; i<5 ; i ){
console.log(i)
await delay(1000);
if(i==2){
resolveMain(2);
}
}
});
}
這也是扭曲的LOL。
所以我敢肯定還有很多其他方法可以做到這一點,但我假設你想保留await delay(1000);. 您需要的是異步生成器功能。
app.post('/test', async (req, res)=>{
const body = JSON.stringify(req.body)
await doSomething()
res.status(200).send("ok");
});
async function* doLoopyThing(){
let times = 0;
for(let i=0 ; i<5 ; i ){
console.log(i)
await delay(1000);
if(i==2){
yield 2;
}
}
}
function doSomething(){
return new Promise(resolve => {
const looper = doLoopyThing();
looper.next().then(({value}) => resolve(value));
looper.next();
}
}
這也是扭曲的,但它應該作業。
我不明白這怎么可能是真正完成某事的正確方法。但我假設這只是為了好玩,或者你正在努力學習。
此外,如果您試圖展示的
await delay(1000)只是一個繁重的函式,并且您實際上并不需要該函式是異步的,那么第一個解決方案應該可以作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/448920.html
下一篇:將單頁PDF轉換為影像
