首页 \ 问答 \ 如何将嵌套setTimeouts转换为承诺(How to convert nested setTimeouts to promises)

如何将嵌套setTimeouts转换为承诺(How to convert nested setTimeouts to promises)

使用rsvp.js或任何其他promises / A +实现如何转换代码如...

console.log('step 1');
setTimeout(function() {
  console.log('step 2');
  setTimeout(function() {
    console.log('step 3');
  }, 100);
}, 300);

纳入承诺实施?


Using rsvp.js or any other promises/A+ implementation how can I turn code like...

console.log('step 1');
setTimeout(function() {
  console.log('step 2');
  setTimeout(function() {
    console.log('step 3');
  }, 100);
}, 300);

into a promises implementation?


原文:https://stackoverflow.com/questions/29396079
更新时间:2021-06-07 22:06

最满意答案

创建一个返回一个Promise的延迟函数,并且在setTimeout经过指定的时间后,它实际上会解析它,就像这样

function delay(time) {
    return new RSVP.Promise(function (resolve) {
        setTimeout(resolve, time);
    });
}

然后你可以像这样调用它

console.log("step 1");
delay(3000)
    .then(function () {
        console.log("step 2");
        return delay(1000);
    })
    .then(function () {
        console.log("step 3");
    });

Create a delay function which returns a Promise and it actually resolves it after the specified time elapses in setTimeout, like this

function delay(time) {
    return new RSVP.Promise(function (resolve) {
        setTimeout(resolve, time);
    });
}

and then you can invoke it like this

console.log("step 1");
delay(3000)
    .then(function () {
        console.log("step 2");
        return delay(1000);
    })
    .then(function () {
        console.log("step 3");
    });

相关问答

更多

如何将现有的回调API转换为承诺?(How do I convert an existing callback API to promises?)

承诺有状态,他们开始正在等待,可以解决: 实现意味着计算成功完成。 拒绝意味着计算失败。 承诺返回函数不应该抛出 ,应该返回拒绝。 从承诺返回函数中抛出将强制您同时使用一个} catch { 和 .catch 。 使用承诺API的人员不会期待承诺。 如果您不确定异步API在JS中的工作原理,请先阅读此答案 。 DOM加载或其他一次事件: 因此,创造承诺通常意味着指定何时解决 - 这意味着当他们转到履行或拒绝阶段以指示数据可用(并且可以使用.then )访问。 使用支持Promise构造函数(如本机 ...

为什么在执行嵌套的setTimeouts内部没有removeAttribute调用(Why aren't removeAttribute calls inside of nested setTimeouts being executed)

您不应该使用addAttribute / removeAttribute来添加/删除类/样式。 (HTML属性确定HTML的当前状态,但有关当前DOM状态的权威信息在DOM节点属性中。 请参阅此问题。 )相反,如果您不想使用任何实用程序库(如jQuery) ,请使用HTMLElement.style用于设置内联样式的属性和用于添加/删除类的Element.classList API。 编辑:乍一看,我在您的代码中看到了另外一个错误。 您计划在0.5秒后使用原始变量值执行部分操作,但随后更改值。 在 ...

嵌套承诺 - 更好的方法?(nested promises - better way?)

你正在混合回调和承诺,并使它变得比以往更难。 所有的异步函数都应该返回一个promise,而不是使用第二个.then()作为错误处理程序,你应该让.catch()函数处理错误。 您目前的代码可以替换为 $scope.$on('forceLockAfterModalSubmit', function(e, data) { if (!$scope.newItemCreatedIsLocked) { $scope.setLockForCurrentUser(); $scope.edi ...

如何在javascript中创建嵌套的promises?(How to create nested promises in javascript?)

你的问题代表了这两个功能,我添加了注释来标记它们: function promiseToProcessElement(id,num,callbackProcessElement,matrix) { return new Promise((resolve, reject) => { var result=callbackProcessElement(id, num,matrix); resolve(result);//You resolve the promise without waiti ...

如何使用promises转换此代码?(How do I convert this code using promises?)

使用参数(err, rows) ,所有四个函数似乎都被写为nodebacks,我们可以精确地猜测原始工作代码的样子。 无需修改,nodebacks只能用作nodebacks。 将它们原始插入到承诺链中是行不通的。 但是您的功能将在以下情况下在承诺链中起作用: 宣传潜在的asycn函数,即connection的方法。 在函数中调用connection.methodAsync()版本的方法而不是connection.method() 。 从您的每个职能部门返回承诺。 整个事情实际上更好用一点重命名/重 ...

如何将嵌套setTimeouts转换为承诺(How to convert nested setTimeouts to promises)

创建一个返回一个Promise的延迟函数,并且在setTimeout经过指定的时间后,它实际上会解析它,就像这样 function delay(time) { return new RSVP.Promise(function (resolve) { setTimeout(resolve, time); }); } 然后你可以像这样调用它 console.log("step 1"); delay(3000) .then(function () { ...

多个setTimeouts互相取消?(multiple setTimeouts cancel each other out?)

您正在使用全局变量$elm 。 在执行超时之前单击按钮时,变量已被覆盖,并且方法( $elm.fadeOut )不再绑定到该元素(因为变量引用了创建的最新元素)。 我的建议是在函数中使用var使其成为本地的: var $elm = $('<div class="fadepopup"></div>'); 请参阅更新小提琴 You are using the global variable $elm. When you click the button before the timeout has e ...

暂停和恢复setTimeouts数组(pause and resume array of setTimeouts)

编辑:不知怎的,我错过了Igoel的评论,他说同样的话。 对于那个很抱歉。 没有简单的方法来查询超时以查看已经过了多长时间。 您可以将超时的开始时间存储在单独的变量中,然后显式计算差异。 FWIW,请注意,JavaScript超时不一定准确,因为JavaScript是单线程执行环境。 Edited: Somehow I missed Igoel's comment where he says the same thing. Sorry about that. There is no simple ...

如何处理嵌套的承诺?(How to handle nested promises?)

您不必nest这些承诺,您可以执行以下操作: function start_it_all(){ return $cordovaSQLite.execute(db, "SELECT foo FROM bar") .then(function(result) { return $http.get('foo.php'); }) .then(function(){ // Here I get some data }); } ...

嵌套承诺(Nested Promises)

您正在异步构造typePromises列表 - 当您调用Q.all(typePromises) ,它仍然是空的。 相反,您需要立即返回数据库结果的承诺,您可以立即将其收集到列表中。 如果您还不知道这些承诺的返回值是什么 - 不用担心, then在redis结果到达后使用如下任务来Q.all(chorePromises)等任务。 我还建议使用map而不是在each循环中推送到一个数组 - 这也有助于确保承诺立即构建。 myClass.prototype.doMaintenance = functio ...

相关文章

更多

最新问答

更多
  • 如何从远程文件拉取文件而不覆盖本地文件?(How do I pull files from remote without overwriting local files?)
  • Reactjs:状态改变时重新渲染iframe(Reactjs: re-renders iframes when state changed)
  • 奇怪的网址,以及跟随php页面流程的困难(odd url, and difficulty in following the php page flow)
  • 标签活动无效(Tab Activity is not working)
  • JavaME合适的语法编译器建议?(JavaME-suitable grammar compiler recommendations?)
  • 指定参数(Specifying arguments)
  • 可以通过Ruby插件或控制台覆盖Sketchup中的键盘快捷键吗?(Can one override keyboard shortcuts in Sketchup through the a Ruby Plugin or Console?)
  • 计算Java EE Web App中用户数的最佳方法(Best way to count number of users in a Java EE web App)
  • 无法使用templateUrl加载cordova中的外部模板(unable to load external templates in cordova with templateUrl)
  • PHPExcel:写入期间无法使用缓存(PHPExcel: Unable to use cache during write)
  • 在javascript中嵌套这个指针(nested this pointer in javascript)
  • 谁跟领航致远培训过,有问题问下啊
  • 控制器要求在入门时下载(Controller ask to download on entry)
  • 未能通过conda安装Asyncio(Failure to install Asyncio via conda)
  • 如何查找已完成项目的总长度?(How to find length of total completed items?)
  • 如何检查OleInitialize是否已被调用?(How to check if OleInitialize has already been called?)
  • SQL在特定范围内返回列中具有最大值的行(SQL Returning rows with max value in column, within a specific range)
  • preg_match从url获取id(preg_match get the id from url)
  • 如何在运算符中为make方程转换perl变量?(How to convert a perl variable in a operator for make equations?)
  • 在导航上方添加空格/标题。(Add a white space/ header above navigation.)
  • MeetingItem已保存;(MeetingItem saved; but change now shown in Calendar)
  • c#vb:我们应该使用System.Lazy进行资源密集型任务吗?(c# vb: Should we use System.Lazy for resource-intensive task? (when threading is not needed))
  • 为什么在armeabi代码中使用armeabi-v7a代码?(Why use armeabi-v7a code over armeabi code?)
  • 获取请求的自定义标头(Java HTTP)(Fetching a custom header of a request (Java HTTP))
  • 是否可以在嵌套的if语句中从varchar转换为numeric以动态评估参数?(Is it possible to convert from varchar to numeric within a nested if statement in order to dynamically evaluate a parameter?)
  • 如何将Html.ActionLink转换为链接到Ajax调用的按钮?(How to convert from Html.ActionLink to a button linked to Ajax call?)
  • 应用程序如何处理Windows符号链接?(How are Windows symbolic links treated by the apps?)
  • html,js,css在jsfiddle中工作,但不在sharepoint中(html, js, css works in jsfiddle but not in sharepoint)
  • 从Ruby脚本调用Elasticsearch Rest API(Calling Elasticsearch Rest API from Ruby script)
  • 如何将嵌套setTimeouts转换为承诺(How to convert nested setTimeouts to promises)