在 Promise 链上使用 setTimeout

2024-04-02

在这里,我试图围绕承诺进行思考。在第一个请求中,我获取一组链接。在下一个请求中,我获取第一个链接的内容。但是我想在返回下一个承诺对象之前进行延迟。所以我使用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(使用前将#替换为@)

在 Promise 链上使用 setTimeout 的相关文章

  • 我可以从 HTTP 请求中找到无线接入点的 BSSID(MAC 地址)吗?

    假设有人在咖啡店里无线连接到互联网 并向 johnsveryownserver com 发送 HTTP 请求 服务器端 有什么方法可以确定我的MAC地址吗 无线接入点他们连接到什么 请注意 我对他们机器的 MAC 地址不感兴趣 如果我无法使
  • Ext JS - 如何滚动到文本区域的底部

    这是我下面的代码 如何滚动到文本区域的底部 它一定是类似的东西 Ext getCmp output setScrollPosition Ext getCmp output getScrollHeight 这是我的文本区域代码 var myW
  • 在浏览器中语音聊天? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在寻求建立一个小组 voice 使用服务器上的node js 在浏览器中聊天 这可能吗 如果您希望您的解决方案是基于服务器端和客
  • 将 Sweet Alert 弹出窗口添加到 React 组件中的按钮

    我为 Bootstrap 和 React 找到了这个完美的 Sweet Alert 模块 我在 Meteor 应用程序中使用它 http djorg83 github io react bootstrap sweetalert http d
  • 如何在 d3 js 中突出显示从根到选定节点的路径?

    我使用 d3 js 创建了一棵树 现在我创建了一个下拉菜单 其中包含树中所有节点的列表 现在 从下拉菜单中选择一个节点时 我想突出显示从根到该特定节点的路径 这个怎么做 首先创建一个 flatten 函数 它将分层数据变成一个 n 数组 f
  • 创建 Cookie 时需要帮助

    我有一个名为yes和另一个名叫no
  • 如何记录返回的事件发射器

    如何记录所发出的事件stream返回于MyFunc 与 JSDoc MyFunc description param Object opts description return Stream description function My
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • JavaScript 动画平滑滚动

    默认情况下 当您有这样的片段链接时 a href some url some fragment some text a 浏览器立即向下滚动到该片段 我该如何编程才能使用标准 JS 顺利地向下移动到该片段 这是一个例子 Example htt
  • Aptana Studio 3 上的预览选项卡在哪里?

    我在 Windows PC 上使用 Aptana Studio 2 并有一个选项卡用于在 IE 上预览页面 另一个选项卡用于在 Firefox 上预览 但我切换到了 Aptana 3 我不知道是没有预览还是我没有找到它 是的 我在 stac
  • 简单、安全的API认证系统

    我有一个简单的 REST JSON API 供其他网站 应用程序访问我网站的一些数据库 通过 PHP 网关 基本上该服务的工作原理如下 调用 example com fruit orange 服务器返回有关橙子的 JSON 信息 问题是 我
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • React无限滚动scrollableTarget动态获取id?

    我在我的项目中使用react infinite scroll component 如何让scrollableTarget动态获取item id 我试过这样scrollableTarget item id 但它不起作用 必须与该 div 具有
  • 是否可以使用打字稿映射类型来创建接口的非函数属性类型?

    所以我正在研究 Typescript 的映射类型 是否可以创建一个接口来包装另一种类型 从而从原始类型中删除函数 例如 interface Person name string age number speak void type Data
  • window.showModalDialog 的等效跨浏览器解决方案是什么?

    window showModalDialog 的等效跨浏览器解决方案有哪些 showModalDialog 在 IE 和 FF 3 中引入 我个人认为没有 但是有很多 UI 工具包提供了这样的功能 例如jQuery UI http jque
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • 在java中创建一个XML树并将其转换为json对象

    我尝试创建也能够转换为 json 的树 但对于只有一个xpath 当我尝试实现多个 xpath 时 我无法获得所需的输出 这里我分享一下我的实现 private static Document addElemtbypath List
  • 加载另一个 JS 脚本后加载

    这是我的代码 very big js file lots of html stuff 问题是 这些是异步加载的 有没有办法等待第二个脚本直到第一个脚本加载 如果您使用 jQuery 有一个非常简单的方法可以通过获取脚本 https api
  • 在 javascript 中使用 xPath 解析具有默认命名空间的 XML

    我需要创建一个 XML xPath 解析器 所有解析都必须在客户端进行 使用 JavaScript 我创建了一个 javascript 来执行此操作 在默认名称空间发挥作用之前 一切看起来都正常 我根本无法查询具有默认命名空间的 XML 我

随机推荐

  • 如何解决 HttpURLConnection 上的 NullPointerException?

    我正在开发一个Android应用程序 使用ExoPlayer进行视频播放 使用Glide进行图像显示 使用下载库进行文件下载 它们都有与HttpURLConnection相关的NullPointerException 我确信使用的链接是可用
  • Java中的BlockingQueue是完全线程安全的吗

    我知道文档说该对象是线程安全的 但这是否意味着从所有方法对它的所有访问都是线程安全的 所以如果我打电话put 同时从多个线程上进行操作take 在同一时刻 不会有什么不好的事情发生吗 我问这个问题是因为这个答案让我再次猜测 https st
  • SQL:使用 FOR XML 每个元素一行

    我有一个 SQL Server 2005 查询 它生成一个大结果集 最多几 GB SELECT FROM Product FOR XML PATH Product 运行查询会生成一行 其中包含具有许多产品元素的文档 Row 1
  • 基于角色在GridView中显示编辑按钮

    我有一个网格视图 我添加了AutoGenerateEditButton True 我想向属于特定角色的用户显示该按钮 如果不是 则不会呈现按钮 你有什么建议吗 我必须处理哪个事件才能实现该目的 我是否必须使用模板驱动的控件 例如 ListV
  • 如何将 csv 文件导入到使用 R 内核的 Google Colab 中?

    我的计算机上有一个 csv 文件 可以将其上传到 Google 云端硬盘 我正在尝试使用 Google colab 但使用 R 而不是 Python 我怎样才能导入这个csv https stackoverflow com a 579272
  • 在scala中如何将一个案例类转换为另一个不受代码更改字段添加影响的案例类?

    case class Cat color Int isFat Boolean case class Kitten color Int isFat Boolean 我想从 Cat 构造 Kitten 但希望在不传递所有参数的情况下自动执行此操
  • 如何通过 github api 获取热门 github 存储库列表?

    我想要获取像这样的 github 趋势存储库列表 https github com trending l java https github com trending l java但我没有找到任何类似的请求方法https developer
  • 将日期从波斯语转换为公历

    如何使用 System globalization PersianCalendar 将波斯日期转换为公历日期 请注意 我想转换我的波斯日期 例如今天是 1391 04 07 并获得公历日期结果 在本例中为 06 27 2012 我正在数秒等
  • 在 Emacs 中设置选项卡大小

    我使用 Emacs 作为编辑器 我想将制表符大小设置为四个空格 在我的 emacs文件我有以下内容 setq default tab width 4 我也尝试过 set default tab width 4 不管怎样 当我打开 emacs
  • 在本机应用程序和网站之间共享凭据

    我正在开发的一个应用程序允许用户登录支持 OAuth 的后端 因此 应用程序仅了解身份验证令牌和用户元数据 而不了解用户的凭据 在应用程序中 用户可以点击在浏览器中打开链接的链接 这些资源也受到 OAuth 的保护 登录原生应用时获得的 t
  • 在哪里可以找到 Apache Lucene/Solr 的性能基准

    是否有任何针对大型数据集上 Lucene Solr 性能基准的链接 资源 500GB 5TB以上范围的数据集 Thanks Lucene 提交者 Mike McCandless 运行基准 http people apache org mik
  • Stackoverflow 使用本地存储进行授权似乎不安全。这是正确的,否则我们如何加强它?

    我一直在研究类似于 stackexchange 的身份验证和授权模块 现在我确信他们使用某种模型的 oAuth 或令牌生成服务器来授权使用他们的各个站点 我尝试了一个小实验 登录 Stackoverflow 后 我会从开发者控制台删除所有
  • 不同屏幕尺寸下的android布局

    尝试了解屏幕尺寸 以便我的应用程序在不同设备上看起来相同 我有两台设备 Galaxy s3 和 Galaxy Tab 8 两者的屏幕分辨率相同 均为 720 x 1280 但 s3 为 4 7 英寸 而 Tab 为 8 英寸 当我进行线性布
  • UNION 类型“...”和“...”无法匹配

    当我运行下面的查询时 我收到此错误 UNION 类型 text 和 bigint 无法匹配 SELECT 1 AS STEP AS ProviderName AS Procedurecode Claimid Patient First Na
  • 如何使react-bootstrap模式可拖动

    我尝试过让它发挥作用 但这就是发生的事情 使用react draggable npm 包 我能够使内容可拖动和可放置 但整个对话框的背面保持原位 之后看起来就破碎了 我也在网上找到了这个https gist github com burga
  • 在任务之间复制 contextvars.Context

    我有一个程序 ASGI 服务器 其结构大致如下 import asyncio import contextvars ctxvar contextvars ContextVar ctx async def lifepsan ctxvar se
  • 为什么这个break语句break不起作用?

    我有以下代码 public void post String message final String mess message new Thread public void run while true try if status equ
  • Terraform 应用抛出错误“等待插件启动时超时”

    我在 terraform 应用期间遇到以下错误 Error timeout while waiting for plugin to start Debug LOG 2020 07 09T13 15 46 551 0400 DEBUG plu
  • kendo ui 取消树视图放置

    我有一个 TreeView 一旦用户将项目放到所需的位置 它会显示一个对话框并要求确认 如果用户选择取消 我还如何取消项目的放置 以便它返回到其原始位置 我当前的代码如下但不起作用 var newDiv document createEle
  • 在 Promise 链上使用 setTimeout

    在这里 我试图围绕承诺进行思考 在第一个请求中 我获取一组链接 在下一个请求中 我获取第一个链接的内容 但是我想在返回下一个承诺对象之前进行延迟 所以我使用setTimeout就可以了 但它给了我以下 JSON 错误 without set