在这里,我试图围绕承诺进行思考。在第一个请求中,我获取一组链接。在下一个请求中,我获取第一个链接的内容。但是我想在返回下一个承诺对象之前进行延迟。所以我使用setTimeout就可以了。但它给了我以下 JSON 错误(without setTimeout() it works just fine
)
语法错误:JSON.parse:第 1 行第 1 列出现意外字符
JSON 数据
我想知道为什么会失败?
let globalObj={};
function getLinks(url){
return new Promise(function(resolve,reject){
let http = new XMLHttpRequest();
http.onreadystatechange = function(){
if(http.readyState == 4){
if(http.status == 200){
resolve(http.response);
}else{
reject(new Error());
}
}
}
http.open("GET",url,true);
http.send();
});
}
getLinks('links.txt').then(function(links){
let all_links = (JSON.parse(links));
globalObj=all_links;
return getLinks(globalObj["one"]+".txt");
}).then(function(topic){
writeToBody(topic);
setTimeout(function(){
return getLinks(globalObj["two"]+".txt"); // without setTimeout it works fine
},1000);
});
为了保持承诺链的运行,你不能使用setTimeout()
就像你所做的那样,因为你没有返回来自.then()
处理程序 - 您正在从setTimeout()
回调对你没有好处。
相反,您可以创建一个简单的小延迟函数,如下所示:
function delay(t, val) {
return new Promise(resolve => setTimeout(resolve, t, val));
}
然后像这样使用它:
getLinks('links.txt').then(function(links){
let all_links = (JSON.parse(links));
globalObj=all_links;
return getLinks(globalObj["one"]+".txt");
}).then(function(topic){
writeToBody(topic);
// return a promise here that will be chained to prior promise
return delay(1000).then(function() {
return getLinks(globalObj["two"]+".txt");
});
});
在这里你正在返回一个承诺.then()
处理程序,因此它被适当地链接。
你也可以给Promise对象添加一个delay方法,然后直接使用.delay(x)
你的承诺的方法如下:
function delay(t, val) {
return new Promise(resolve => setTimeout(resolve, t, val));
}
Promise.prototype.delay = function(t) {
return this.then(function(val) {
return delay(t, val);
});
}
Promise.resolve("hello").delay(500).then(function(val) {
console.log(val);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)