提问者:小点点

为了异步调用任意函数,可以将异步函数传递给setImmediate吗?


我想异步调用一个给定的函数。包装函数tryCallAsync是实现这一点的一种方法。这种方法是有效的。但是,它要求setImmediate的回调是一个异步函数。这似乎是错误的,因为回调返回的是一个没有使用的承诺。为此目的向setImmediate传递一个异步函数是错误的吗?

function tryCallAsync (fn) {

    let args = Array.prototype.slice.call(arguments, 1);

    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));

共1个答案

匿名用户

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

    不处理返回的承诺,特别是它不处理错误sup1/sup/li>

而拒绝返回的承诺,它仍然感觉错误/sub>

函数应该写成

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

相关问题