在这里,我试图将我的头绕在 Promise 上。在第一次请求时,我会获取一组链接。在下一次请求时,我会获取第一个链接的内容。但是我想在返回下一个 Promise 对象之前进行延迟。所以我在上面使用 setTimeout 。但它给了我以下 JSON 错误(没有 setTimeout() 它工作得很好
)
SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
我想知道为什么会失败?
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);
});
最佳答案
要保持 promise 链继续运行,您不能像以前那样使用 setTimeout()
,因为您没有从 .then()
返回 promise handler - 你从 setTimeout()
回调中返回它,这对你没有好处。
相反,您可以像这样制作一个简单的小延迟函数:
function delay(t, v) {
return new Promise(resolve => setTimeout(resolve, t, v));
}
然后,像这样使用它:
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 ,因此它被适本地链接起来。
您还可以向 Promise 对象添加延迟方法,然后直接在您的 Promise 上使用 .delay(x)
方法,如下所示:
function delay(t, v) {
return new Promise(resolve => setTimeout(resolve, t, v));
}
Promise.prototype.delay = function(t) {
return this.then(function(v) {
return delay(t, v);
});
}
Promise.resolve("hello").delay(500).then(function(v) {
console.log(v);
});
关于javascript - 在 promise 链上使用 setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39538473/