如何将fetch处理得到的value变量传入独立于one()函数的JSON对象x
实现可行性结论
你描述的需求完全可以实现,但你当前写的代码直接运行会因为作用域、异步时序问题报错,需要做小幅调整
原代码运行报错的原因
- 作用域隔离问题:
multiply()内部定义的const value是该函数的局部变量,外部作用域没有办法直接读取它。你在创建x的时候直接写value: value,会因为找不到这个变量抛出ReferenceError。 - 异步时序错位问题:
one()内部的fetch请求是异步执行的,调用one()之后,代码不会等待网络响应返回,会立刻向下执行创建x对象的逻辑。这时候fetch的响应还没回来、multiply的计算流程还没执行完,就算解决了作用域问题,也拿不到已经计算完成的value值。
符合位置要求的实现方案
严格遵守「x不能放置在one()函数或其他任何嵌套函数内部」的限制,我们完全不需要改动x的定义位置,只需要调整异步流程的处理逻辑即可:
- 先在something的顶层作用域定义完整的x对象结构,把需要动态赋值的
value字段设为空的初始值 - 修改
one()函数,把内部的fetch异步链通过return暴露出去,让one()本身可以返回最终计算得到的value值 - 等待
one()的异步流程执行完成、拿到计算后的value值后,再给已经定义好的x对象的对应字段赋值
修正后的核心JS代码如下:
function something(){ // x 直接定义在something顶层作用域,符合位置限制要求 var x = { purchase_units: [ { amount: { value: '' // 留空作为初始值,后续动态填充 }, }, ], }; function one() { let url = 'https://data.heroku.com/dataclips/szmszzhrbbuhxqfunbmblylxijko.json'; // 返回完整的Promise链,对外暴露异步流程的最终计算结果 return fetch(url) .then(res => res.json()) .then((out) => out.values[out.values.length - 1][2]) .then((values2) => multiply(values2)) .catch((err) => { throw err }); function multiply(values) { var amounts = document.getElementById("amount").value; var amounts2 = (values * amounts); const value = amounts2.toString(); console.log(value); return value; } } // 异步流程完成后给已定义的x字段赋值,不改变x的作用域位置 one().then(computedValue => { x.purchase_units[0].amount.value = computedValue; // 赋值完成后再执行依赖x的后续逻辑 console.log(JSON.stringify(x)); }); }
合规性说明
整个实现流程中,x的定义位置始终在something()的顶层作用域,没有被移动到one()、multiply()或者其他任何嵌套函数内部,完全满足你提出的位置要求。
内容的提问来源于stack exchange,提问作者pete
相关产品推荐
相关产品推荐

