You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:31:14