javascript - 在 promise 链上使用 setTimeout

在这里,我试图将我的头绕在 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);
});

https://stackoverflow.com/questions/39538473/

相关文章:

javascript - 如果名称包含点,如何获取对象值?

python - 如何使用 python 请求和处理 JSON?

javascript - 请求的资源错误中不存在 'Access-Control-Allow-Ori

javascript - 将 JSON 发送到服务器并返回 JSON,无需 JQuery

javascript - JSON Stringify 因 UTC 而更改日期时间

python - 如何在 Python 中美化 JSON?

javascript - JSON 是否应该包含空值

python - Google App Engine 模型的 JSON 序列化

c# - 将 POST 中的 json 发送到 Web API 服务时出错

json - json.js 和 json2.js 的区别