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

如何从函数返回字符串至另一函数?异步返回值异常求助

问题分析与解决:ShippingEstimator类异步方法返回值异常

核心问题原因

你遇到的问题本质是异步操作的执行顺序导致的:

  • utils.api.cart.getCart是异步API调用,它的回调函数要等API请求完成后才会执行
  • myFunction里的return str;会在API请求还没结束、回调还没执行时就先跑了,所以返回的是初始的空String对象(改用原始字符串后初始值是undefined,自然返回undefined)

解决方案1:用Promise处理异步(现代JS推荐方式)

修改myFunction返回Promise,在API请求完成后传递结果:

myFunction() {
    return new Promise((resolve, reject) => {
        utils.api.cart.getCart({}, (err, response) => {
            if (err) {
                reject(err); // 处理API请求错误
                return;
            }
            let str = ''; // 直接用原始字符串,不要用new String()
            for (let i = 0; i < response.lineItems.physicalItems.length; i++) {
                // 用模板字符串拼接更清晰
                str += `{${response.lineItems.physicalItems[i].sku}}|{${response.lineItems.physicalItems[i].quantity}}`;
            }          
            console.log(str);
            resolve(str); // 把拼接好的字符串传递出去
        });     
    });
}

调用时用async/await获取结果:

// 把点击回调改成async函数
$('.shipping-estimate-submit', this.$element).on('click', async event => {
    if (this.shippingValidator.areAll('valid')) {
        try {
            const result = await this.myFunction();
            console.log(result); // 现在能拿到正确的拼接字符串
        } catch (err) {
            console.error('获取购物车数据失败:', err);
        }
        return;
    }
});

解决方案2:用回调函数(新手易理解的异步写法)

如果暂时不想用Promise,可以给myFunction传入回调函数,在API请求完成后执行:

myFunction(callback) {
    utils.api.cart.getCart({}, (err, response) => {
        if (err) {
            callback(err, null); // 传递错误
            return;
        }
        let str = '';
        for (let i = 0; i < response.lineItems.physicalItems.length; i++) {
            str += `{${response.lineItems.physicalItems[i].sku}}|{${response.lineItems.physicalItems[i].quantity}}`;
        }          
        console.log(str);
        callback(null, str); // 传递拼接好的字符串
    });     
}

调用时传入回调接收结果:

$('.shipping-estimate-submit', this.$element).on('click', event => {
    if (this.shippingValidator.areAll('valid')) {
        this.myFunction((err, result) => {
            if (err) {
                console.error('请求出错:', err);
                return;
            }
            console.log(result); // 正确输出拼接后的字符串
        });
        return;
    }
});

额外注意事项

  • 不要用new String("")创建字符串,直接用原始字符串''或""即可,避免出现String{''}这种对象形式的输出
  • 字符串拼接优先用模板字符串(`xxx${变量}xxx`),比+拼接更易读、不易出错

内容的提问来源于stack exchange,提问作者ARDW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:55:23