如何在保留Task返回值的同时将回调式函数Promise化?
问题描述
我拿到了这样一个API:
function doSomeWork(callbacks : { success ?: (result : SuccessCallbackResult) => void, fail ?: (result : FailCallbackResult) => void, complete ?: (result : CompleteCallbackResult) => void }) : Task
通过简单包装得到了返回Promise的函数,但丢失了原API返回的Task:
function doSomeWorkAsync() : Promise<SuccessCallbackResult> { return new Promise((resolve, reject) => { const callbacks = { success: resolve, fail: reject, }; doSomeWork(callbacks); }); }
我需要同步获取Task(因为要调用它的.abort()方法),想实现一个同时返回Promise和Task的函数:
function doSomeWorkAsync() : [Promise<SuccessCallbackResult>, Task] { // implementation }
解决方案
完全可以实现,核心是同步捕获doSomeWork返回的Task实例,同时将回调与Promise的状态绑定。这里提供两种简洁的实现方式:
方式一:简洁同步捕获
function doSomeWorkAsync(): [Promise<SuccessCallbackResult>, Task] { let task: Task; const promise = new Promise<SuccessCallbackResult>((resolve, reject) => { const callbacks = { success: resolve, fail: reject, // 可选:如需处理complete回调,可在此添加逻辑 complete: (result) => { // 比如结合Promise的finally做后续处理 } }; // 同步调用doSomeWork并捕获Task task = doSomeWork(callbacks); }); // doSomeWork是同步执行的,task此时必然已赋值 return [promise, task]; }
方式二:分离回调与Task捕获(逻辑更清晰)
function doSomeWorkAsync(): [Promise<SuccessCallbackResult>, Task] { // 先创建Promise并保存resolve/reject引用 let resolvePromise: (value: SuccessCallbackResult) => void; let rejectPromise: (reason: FailCallbackResult) => void; const promise = new Promise<SuccessCallbackResult>((resolve, reject) => { resolvePromise = resolve; rejectPromise = reject; }); // 创建回调并调用doSomeWork获取Task const callbacks = { success: resolvePromise!, fail: rejectPromise!, complete: (result) => { // 可选处理complete逻辑 } }; const task = doSomeWork(callbacks); return [promise, task]; }
关键说明
- 两种方式都能同步拿到
Task实例,直接调用.abort()方法 doSomeWork是同步执行的,因此不会出现task未赋值的情况- 如需处理
complete回调,可在回调对象中补充对应逻辑,比如结合Promise的finally统一处理收尾操作
内容的提问来源于stack exchange,提问作者Sunshine Li
相关产品推荐
相关产品推荐

