是否可以将异步函数传递给 setImmediate 以异步调用任意函数?

sta*_*ter 5 node.js promise

我想异步调用给定的函数。包装函数 tryCallAsync 是执行此操作的一种方法。这种方法有效。但是,它要求 setImmediate 的回调是异步函数。这似乎是错误的,因为回调返回了一个未使用的 Promise。为此目的将异步函数传递给 setImmediate 是否错误?

async function tryCallAsync(fn, ...args) {

    return new Promise((r, j) => {

        setImmediate(async () => {

            try {
                r(await fn(...args));
            }
            catch (e) {
                j(e);
            }
        })
    })
}

//  Using tryCallAsync

let resolveAsync = tryCallAsync(()=>{
    return new Promise((r,j)=>{
        setImmediate(()=>r('resolveAsync'));
    });
})

resolveAsync.then((resolve)=>console.log(resolve));

let resolve = tryCallAsync(()=>{
    return 'resolve';
});

resolve.then((resolve)=>console.log(resolve));
Run Code Online (Sandbox Code Playgroud)

注意:https://www.youtube.com/watch? v=e3Nh350b6S4

Ber*_*rgi 6

是的,这是错误的,原因有多种:

  • setImmediate不处理返回的promise,特别是不处理错误1
  • 使用 Promise 时,不要将业务逻辑放入异步(非 Promise)回调中。从那里确定一个承诺,没有别的。

1:即使您的特定回调从未因try/拒绝返回的承诺catch,但它仍然感觉不对

你的函数应该写成

async function tryCallAsync(fn, ...args) {
    await new Promise(resolve => {
        setImmediate(resolve);
    });
    return fn(...args);
}
Run Code Online (Sandbox Code Playgroud)