我想异步调用一个给定的函数。包装函数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));
是的,这是错误的,原因有很多:
函数应该写成
async function tryCallAsync(fn, ...args) {
await new Promise(resolve => {
setImmediate(resolve);
});
return fn(...args);
}