javascript - 在 promise 链上使用 setTimeout

标签 javascript json 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);
});

关于javascript - 在 promise 链上使用 setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39538473/

相关文章:

android - 无法从 android 解析 JSON,因为 asp.net 服务器不返回数组名称

javascript - 等待循环中调用的所有 promise 完成

javascript - 如何在 Javascript 的基于 promise 的设置中调用 "apply"以将参数传递给下一个 then()?

javascript - 是否可以编写一个使所有浏览器标准兼容的 JavaScript 库?

javascript - Web3/元掩码 : Error: Contract has not been deployed to detected network (network/artifact mismatch) on Kovan network

ajax - 用于管理 session 并使用 JSON 响应 ajax 请求的 Delphi 服务器端框架?

json - 如何限制 NewtonSoft.JSON 序列化一个接口(interface)?

node.js - Knex.js - Node 进程永远不会退出,如何优雅地关闭它 - 但只有当所有查询都得到解决时?

javascript - 如何在 RxJs 5 中将项目分组为大小为 n 的组?

javascript - Angular Material Snackbar 配置,带有自定义面板类配置,用于错误、成功、警告消息