JSONata 2.0.0浏览器非异步场景输出[Object Promise]问题咨询
JSONata 2.0.0 返回[Object Promise]的原因及解决办法
原因
JSONata 2.0.0 做了破坏性API变更:evaluate()方法不再同步返回计算结果,而是默认返回Promise对象——哪怕你的表达式里完全没有异步逻辑。而v1.8.0及更早版本中,evaluate()是直接同步返回结果的,这就是旧版本正常、新版本直接赋值会显示[Object Promise]的核心原因。
解决办法
你需要通过Promise的标准处理方式获取实际结果,以下是两种常用方案:
方案1:使用async/await语法
将greeting函数改为异步函数,用await等待evaluate()的执行结果:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JSONata test</title> <script src="https://cdn.jsdelivr.net/npm/jsonata/jsonata.min.js"></script> <script> async function greeting() { var json = JSON.parse(document.getElementById('json').value); var result = await jsonata('"Hello, " & name').evaluate(json); document.getElementById('greeting').innerHTML = result; } </script> </head> <body> <textarea id="json">{ "name": "Wilbur" }</textarea> <button onclick="greeting()">Click me</button> <p id="greeting"></p> </body> </html>
方案2:使用Promise的then()回调
如果不想用async/await,也可以通过then()方法接收结果:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JSONata test</title> <script src="https://cdn.jsdelivr.net/npm/jsonata/jsonata.min.js"></script> <script> function greeting() { var json = JSON.parse(document.getElementById('json').value); jsonata('"Hello, " & name').evaluate(json) .then(result => { document.getElementById('greeting').innerHTML = result; }); } </script> </head> <body> <textarea id="json">{ "name": "Wilbur" }</textarea> <button onclick="greeting()">Click me</button> <p id="greeting"></p> </body> </html>
内容的提问来源于stack exchange,提问作者Ravindu Dissanayake
相关产品推荐
相关产品推荐

