使用async await与setImmediate

6
我希望了解如何在async await中正确使用setImmediate并处理错误。我编写了以下代码,但我不确定它是否符合最佳实践。
我的Express应用程序中有一个路由。
router.get('/parseinvoice', async (req, res, next) => {
    try {
        const parsedInvoiceResponse = await userhelper.getParseInVoiceList();
        res.json({parsedInvoiceResponse})
    } catch (error) {
        res.json({});
    }
});

用户助手类代码
 var userhelper = {};
const fs = require('fs'),
      path = require('path'),    
      filePath = path.join(__dirname, './input_user_story_12.txt');

const { promisify } = require('util')
const readFile = promisify(fs.readFile);



userhelper.getParseInVoiceList = async function() {
    return new Promise( async (resolve, reject) => {
        try {
            setImmediate(async function() {
                try {
                    const contents = await readFile(filePath, 'UTF-8');
                    resolve(contents);
                } catch (error) {
                    reject(error);
                }
            });
        } catch (error) {
           reject(error); 
        }
    });
}


module.exports = userhelper;

虽然我已经得到了响应,但是我对 setImmediate 部分 不确定,是否需要多个 try catch。是否有更简洁的方法来编写下面的代码?

4个回答

2
try {
    setImmediate(async ()=>{
        var res = await readFile(filePath, 'UTF-8');
    })
} catch(err) {
}

2.

await setImmediate(()=>{
       var res = await readFile(filePath, 'UTF-8');
}).catch(){}

3.

try {
    await setImmediate(()=>{
       await readFile(filePath, 'UTF-8');
    }).catch(){}
} catch() {
}

应该将结果返回到res中。
const res = await setImmediate(()=>{
     return readFile(filePath, 'UTF-8');
})

0

为什么你不直接使用呢?

userhelper.getParseInVoiceList = async function() {
    return await readFile(filePath, 'UTF-8');
}

1
我想在事件循环的下一次迭代中执行那段代码,因此我正在使用它。 - Zakir saifi

0

@Dan D. 的回答基础上,您可以在调用异步的 promisified readFile 之前 await 异步 setImmediate 的解析,但是如果没有更多的上下文,我不确定为什么您需要这样做。

userhelper.getParseInVoiceList = async function() {
    await new Promise((resolve) => setImmediate(() => resolve()));
    return await readFile(filePath, 'UTF-8');
}

0

从 Node 15 开始,您可以使用 timersPromises.setImmediate

import { readFile } from "fs/promises";
import { setImmediate as sleepImmediate } from "timers/promises";

userhelper.getParseInVoiceList = async function() {
  await sleepImmediate();
  return await readFile(filePath, 'UTF-8');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接