如何从函数返回字符串至另一函数?异步返回值异常求助
问题分析与解决: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
相关产品推荐
相关产品推荐

