【发布时间】:2016-04-07 16:32:41
【问题描述】:
我有一个链接两个 API 调用的页面,在执行 createPage 函数之前将数据加载到 first_data 和 second_data(这是几 kb 的数据操作和 d3.js):
模板.html
<script src="createPage.js"></script>
<script>
var first_data, second_data = [], [];
function getFirstData(){
return new Promise(function(resolve) {
var xhr = new XMLHttpRequest();
var url = "/API/my-request?format=json"
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
first_data = JSON.parse(xhr.responseText);
resolve('1');
}
}
xhr.open("GET", url, true);
xhr.send();
});
} //similar function for getSecondData()
getFirstData()
.then(getSecondData)
.then(createPage(first_data, second_data));
</script>
问题在于处理createPage 中数据的一些代码显示错误,例如“can't convert undefined to object”。在那个特定错误的情况下,这是因为我尝试对一些应该从 API 请求加载的数据执行Object.keys(data[0])。一些观察:
- 如果我在浏览器开发控制台中检查数据,它就在那里。
- 如果我只是将文件中的代码粘贴到控制台中,页面绘制得很好。
- 如果我为代码的数据操作部分硬编码初始化数组等(以摆脱
can't convert undefined,然后页面绘制,但所有图形都表明它们没有填充数据。 - 如果我将 JSON 数据放在 .js 文件中,并将其作为脚本加载到正文末尾的 createPage.js 文件之前,则页面加载正常。
- 我在
createPage()的开头和结尾插入了一个console.log("starting")语句。查看我加载时的网络和 js 控制台输出,starting输出发生在网络活动中显示两个 API GET 请求之前。这是否代表了真正发生的事情(即您可以混合使用 javascript 控制台和网络控制台计时吗?)
所以,显然我无法在需要时访问数据。
- 为什么?我的
Promises不正确吗? - 我该如何解决这个问题?
【问题讨论】:
-
你正在调用
createPage(first_data, second_data),-()将调用该函数!可能是function(){ createPage(first_data, second_data); } -
好的,这就是问题所在。我非常感谢对为什么
.then(createPage())不会延迟调用函数到承诺解决时的更长解释——我很讨厌函数式编程。而且,这是否意味着我也应该.then(function(){getSecomdData()})? -
补充 Rayon 的答案:您还可以将 Promise 作为
.then的参数。但是是的 - 经验法则 - 总是有.then(someFunction)或.then(somePromise)。
标签: javascript json ajax promise