Questions tagged «promise»

承诺是延迟计算的一种策略,适用于多种并发样式:用于本地计算的线程和事件循环并发,以及同步和异步远程消息传递。一个promise表示异步操作的最终结果。处理承诺的主要方式是通过注册从承诺的最终值或失败原因到新承诺的转换的方法。

4
angular $ q,如何在for循环内和之后链接多个promise
我想要一个for循环,该循环在每次迭代时调用异步函数。 在for循环之后,我想执行另一个代码块,但是在解决for循环中的所有先前调用之前,不要执行。 目前我的问题是,在for循环之后执行的代码块在所有异步调用完成之前执行,或者根本不执行。 带有FOR循环的代码部分及其后的代码块(有关完整代码,请参阅fiddle): [..] function outerFunction($q, $scope) { var defer = $q.defer(); readSome($q,$scope).then(function() { var promise = writeSome($q, $scope.testArray[0]) for (var i=1; i < $scope.testArray.length; i++) { promise = promise.then( angular.bind(null, writeSome, $q, $scope.testArray[i]) ); } // this must not be called before all calls in for-loop have finished …

4
AngularJS资源承诺
我有一个使用$ resource的简单控制器: var Regions = $resource('mocks/regions.json'); $scope.regions = Regions.query(); 我在指令中使用此控制器(在链接功能中) var regions = scope.regions; 但是区域是不确定的。调用是异步的,这很逻辑。 我的问题是我该如何等待结果和区域成为包含所有数据的数组? UPDATE : 这里指令的定义 app.directive('ngMap', function() { return { restrict: 'EA', replace: 'true', scope: { }, template: '<div id="map"></div>', controller: 'AccordMapCtrl', link: function(scope, element, attrs) { var regions = scope.regions; console.log(regions); for (var region in …

6
如何调试JavaScript Promise?
我试图了解如何调试基于Promise的异步代码。承诺是指基于ECMAScript 6的承诺,而调试是指使用内置的chrome或firefox调试器。 我遇到的麻烦是-发生错误时,无论我如何“拒绝”它,我似乎都无法获取堆栈跟踪。 我尝试了这些: console.log(new Error('Error occured')); throw new Error('Throwing an Error'); return new Error('Error returned by the onRejected function'); reject(new Error('Pass Error to the reject function')); 但是这些都不返回代码或堆栈跟踪中的实际错误。 所以我的问题是-如何正确调试JavaScript Promises?

6
C#中的Promise等效项
在Scala中,有一个Promise类可用于手动完成Future。我正在寻找C#中的替代方法。 我正在编写一个测试,并且希望它看起来像这样: // var MyResult has a field `Header` var promise = new Promise<MyResult>; handlerMyEventsWithHandler( msg => promise.Complete(msg); ); // Wait for 2 seconds var myResult = promise.Future.Await(2000); Assert.Equals("my header", myResult.Header); 我知道这可能不是C#的正确模式,但是即使模式有所不同,我也无法找出实现相同目标的合理方法。 编辑:请注意,async/await在这里没有帮助,因为我没有等待的任务!我只有访问将在另一个线程上运行的处理程序的权限。

5
如何实现承诺/延迟库?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 改善这个问题 如何实现像q这样的promise / defer库?我试图阅读源代码,但发现它很难理解,所以我认为如果有人可以从较高层次上向我解释在单线程JS环境中实现promise的技术,那就太好了。例如Node和浏览器。

13
While循环与承诺
用诺言做诸如while循环之类的事情的惯用方式是什么。所以: 如果条件仍然存在,请执行某项操作,然后再次重复执行其他操作。 dosomething.then(possilblydomoresomethings).then(finish) 我这样做是想知道是否有更好/更理想的方法? var q = require('q'); var index = 1; var useless = function(){ var currentIndex = index; console.log(currentIndex) var deferred = q.defer(); setTimeout(function(){ if(currentIndex > 10) deferred.resolve(false); else deferred.resolve(true); },500); return deferred.promise; } var control = function(cont){ var deferred = q.defer(); if(cont){ index = index + 1; …
74 node.js  loops  promise  q 

6
在渲染视图/模板之前,等待Angular 2加载/解析模型
在Angular 1.x中,UI-Router是我的主要工具。通过返回对“ resolve”值的承诺,路由器只需在呈现指令之前等待承诺完成即可。 或者,在Angular 1.x中,空对象不会使模板崩溃-因此,如果我不介意暂时不完整的渲染,则可以$digest在promise.then()填充最初为空的模型对象之后使用渲染。 在这两种方法中,如果可能的话,我宁愿等待加载视图,如果无法加载资源,则取消路线导航。这为我节省了“取消导航”的工作。编辑:请注意,这特别意味着此问题要求使用Angular 2兼容或最佳实践的方法来执行此操作,并在可能的情况下要求避免使用“猫王运算符”!因此,我没有选择答案。 但是,这两种方法都无法在Angular 2.0中使用。肯定有为此计划或可用的标准解决方案。有谁知道它是什么? @Component() { template: '{{cats.captchans.funniest}}' } export class CatsComponent { public cats: CatsModel; ngOnInit () { this._http.get('/api/v1/cats').subscribe(response => cats = response.json()); } } 以下问题可能反映了相同的问题:加载带有数据的PROMISE之后的Angular 2渲染模板。请注意,问题中没有代码或未接受的答案。

4
使用Async / Await正确尝试…捕获语法
我喜欢Async/AwaitTypescript等中提供的新功能的平坦性。但是,我不确定我是否必须await在try...catch块的外部声明要输入的变量以便以后使用,这一点我不确定。像这样: let createdUser try { createdUser = await this.User.create(userInfo) } catch (error) { console.error(error) } console.log(createdUser) // business // logic // goes // here 如果我错了,请纠正我,但是似乎最好的做法是不要在try主体中放置多行业务逻辑,所以我只剩下createdUser在块外声明,在块中分配,以及然后使用它。 在这种情况下,最佳做法是什么?

1
RxJS中的链接可观察对象
我正在学习RxJS和Angular2。比方说,我有一个带有多个异步函数调用的promise链,这取决于前一个的结果,如下所示: var promiseChain = new Promise((resolve, reject) => { setTimeout(() => { resolve(1); }, 1000); }).then((result) => { console.log(result); return new Promise((resolve, reject) => { setTimeout(() => { resolve(result + 2); }, 1000); }); }).then((result) => { console.log(result); return new Promise((resolve, reject) => { setTimeout(() => { resolve(result + 3); …

7
嵌套的Promise在node.js中正常吗?
我在学习node.js时一直困扰着两个星期的问题是如何使用node进行同步编程。我发现,无论我如何尝试按顺序进行操作,我总是以嵌套的诺言告终。我发现存在诸如Q之类的模块,以帮助在可维护性方面实现承诺链。 我不明白,在做研究Promise.all(),Promise.resolve()和Promise.reject()。Promise.reject从名称上来说,它几乎可以自我解释,但是在编写应用程序时,我很困惑如何在函数或对象中包括这些功能而不破坏应用程序的行为。 当来自Java或C#之类的编程语言时,node.js肯定有一个学习曲线。仍然存在的问题是,promise链在node.js中是否正常(最佳实践)。 例: driver.get('https://website.com/login').then(function () { loginPage.login('company.admin', 'password').then(function () { var employeePage = new EmployeePage(driver.getDriver()); employeePage.clickAddEmployee().then(function() { setTimeout(function() { var addEmployeeForm = new AddEmployeeForm(driver.getDriver()); addEmployeeForm.insertUserName(employee.username).then(function() { addEmployeeForm.insertFirstName(employee.firstName).then(function() { addEmployeeForm.insertLastName(employee.lastName).then(function() { addEmployeeForm.clickCreateEmployee().then(function() { employeePage.searchEmployee(employee); }); }); }); }); }, 750); }); }); });

5
如何在Angular 2中取消HTTPRequest?
如何在Angular 2中取消HTTPRequest? 我知道如何仅拒绝请求承诺。 return new Promise((resolve, reject) => { this.currentLoading.set(url, {resolve, reject}); this.http.get(url, {headers: reqHeaders}) .subscribe( (res) => { res = res.json(); this.currentLoading.delete(url); this.cache.set(url, res); resolve(res); } ); });
69 http  promise  angular 

4
Angular JS:如何绑定到Promise
我试图将诺言与观点捆绑在一起。我不知道您是否可以直接执行此操作,但这就是我要尝试执行的操作。有什么想法我做错了吗? 注意:源代码有点超时,并使用静态数据,但这使代码更易于诊断。 编辑: JSFiddle页面:http : //jsfiddle.net/YQwaf/27/ 编辑:解决方案:事实证明您可以直接绑定诺言。我的原始代码有两个问题: 使用setTimeout()代替angular的$ timeout是一个问题。Angular不知道触发超时时需要刷新UI(您可以在setTimeout内部使用$ scope。$ apply解决此问题,也可以只使用$ timeout) 绑定到返回诺言的函数是一个问题。如果第二次被召唤,它将带来另一个承诺。更好的方法是为承诺设置一个范围变量,并仅根据需要创建一个新的承诺。(就我而言,这是在国家/地区代码上调用$ scope。$ watch) HTML: <div ng:controller="addressValidationController"> Region Code <select ng:model="regionCode" ng:options="r.code as r.name for r in getRegions()"/> Country Code<select ng:model="countryCode"><option value="US">United States</option><option value="CA">Canada</option></select> </div> JS: function addressValidationController($scope, $q) { var regions = { US: [{code: 'WI',name: 'Wisconsin'}, {code: …

3
Angular.js中基于单元测试承诺的代码
我在尝试在Angularjs中测试基于承诺的代码时遇到了困难。 我的控制器中有以下代码: $scope.markAsDone = function(taskId) { tasksService.removeAndGetNext(taskId).then(function(nextTask) { goTo(nextTask); }) }; function goTo(nextTask) { $location.path(...); } 我想对以下情况进行单元测试: 什么时候markAsDone被调用tasksService.removeAndGetNext 当tasksService.removeAndGetNext是做了应该改变的位置(调用goTo) 在我看来,没有简单的方法可以分别测试这两种情况。 我测试第一个是: var noopPromise= {then: function() {}} spyOn(tasksService, 'removeAndGetNext').andReturn(noopPromise); 现在,要测试第二种情况,我需要创建另一个永远都是假的承诺resolved。这一切都非常乏味,并且有很多样板代码。 还有其他测试方法吗?还是我的设计有异味?

2
在React Hooks中卸载组件上的清理内存泄漏
我是使用React的新手,所以这可能真的很容易实现,但是即使我做了一些研究,也无法自己解决。如果这太蠢了,请原谅我。 语境 我使用Inertia.js与Laravel(后端)和响应(前端)适配器。如果您不知道惯性,则基本上是: Inertia.js使您可以使用经典的服务器端路由和控制器快速构建现代的单页React,Vue和Svelte应用程序。 问题 我正在做一个简单的登录页面,其表单具有提交时将执行POST请求以加载下一页的形式。似乎工作正常,但在其他页面上,控制台显示以下警告: 警告:无法在已卸载的组件上执行React状态更新。这是空操作,但它表明应用程序中发生内存泄漏。要修复,请取消使用useEffect清理功能中的所有订阅和异步任务。 登录(由Inertia创建) 相关代码(为了避免不相关的行,我对其进行了简化): import React, { useEffect, useState } from 'react' import Layout from "../../Layouts/Auth"; {/** other imports */} const login = (props) => { const { errors } = usePage(); const [values, setValues] = useState({email: '', password: '',}); const [loading, setLoading] = useState(false); …

4
为什么使用Promise.then设置CSS属性,然后实际上不在then块中发生?
请尝试运行以下代码段,然后单击相应的框。 const box = document.querySelector('.box') box.addEventListener('click', e => { if (!box.style.transform) { box.style.transform = 'translateX(100px)' new Promise(resolve => { setTimeout(() => { box.style.transition = 'none' box.style.transform = '' resolve('Transition complete') }, 2000) }).then(() => { box.style.transition = '' }) } }) .box { width: 100px; height: 100px; border-radius: 5px; background-color: …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.