我有一个承诺。 我创build它来取消一个AJAX请求,如果我需要的话。 但是因为我不需要取消那个AJAX,所以我从来没有解决它,AJAX成功完成。 简化的sinippet: var defer = $q.defer(); $http({url: 'example.com/some/api', timeout: defer.promise}).success(function(data) { // do something }); // Never defer.resolve() because I don't need to cancel that ajax. What happens to this promise after request? 永远不会解决这样的承诺导致内存泄漏? 你有关于如何pipe理承诺生命周期的build议吗?
在Angular 1.x中,UI-Router是我的主要工具。 通过返回“parsing”值的承诺,路由器将简单地等待承诺在渲染指令之前完成。 或者,在Angular 1.x中,null对象不会使模板崩溃,所以如果我不介意临时不完整的渲染,我可以使用$digest在promise.then()后面渲染一个最初为空的模型对象。 在这两种方法中,如果可能的话,我宁愿等待加载视图,如果资源无法加载,则取消path导航。 这节省了我的“导航”的工作。 编辑:请注意这个具体意味着这个问题要求一个Angular 2期货兼容或最佳实践的方法来做到这一点,并要求尽可能避免“猫王操作员”! 因此,我没有select这个答案。 但是,这两种方法都不适用于Angular 2.0。 当然有一个标准的解决scheme或可用于此。 有人知道它是什么吗? @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呈现模板 。 请注意,问题中没有代码或接受的答案。
为什么我不能在catchcallback中抛出一个Error ,让进程像在其他任何作用域一样处理错误? 如果我不做console.log(err)没有打印出来,我什么都不知道发生了什么。 这个过程刚刚结束… 例: function do1() { return new Promise(function(resolve, reject) { throw new Error('do1'); setTimeout(resolve, 1000) }); } function do2() { return new Promise(function(resolve, reject) { setTimeout(function() { reject(new Error('do2')); }, 1000) }); } do1().then(do2).catch(function(err) { //console.log(err.stack); // This is the only way to see the stack throw err; // This does nothing […]
使用本机(ES6) Promise 。 我应该拒绝一个错误 : Promise.reject(new Error('Something went wrong')); 或者我应该拒绝一个string: Promise.reject('Something went wrong'); 浏览器行为有什么不同?
我很熟悉新的标准库的std::thread , std::async和std::future组件(例如见这个答案 ),这很简单。 然而,我不能完全掌握std::promise是什么,它在什么情况下最好使用。 标准文档本身并不包含除了类纲要之外的大量信息,也不仅仅是:: thread 。 有人可以给一个std::promise的情况下简短,简洁的例子,它是最习惯的解决scheme?
查看MDN,它看起来像传递给Promise.all then()callback函数的值。所有的值都按照promise的顺序。 例如: var somePromises = [1, 2, 3, 4, 5].map(Promise.resolve); return Promise.all(somePromises).then(function(results) { console.log(results) // is [1, 2, 3, 4, 5] the guaranteed result? }); 任何人都可以引用一个规范,说明应该在哪个顺序values ? PS:像这样运行的代码表明,这似乎是真的,虽然这当然没有证据 – 这可能是巧合。
我正在编写一个JavaScript函数,它发出一个HTTP请求并返回结果的承诺(但这个问题同样适用于基于callback的实现)。 如果我立即知道提供给函数的参数是无效的,那么函数应该同步throw ,还是应该返回一个被拒绝的promise(或者,如果你愿意的话,用Error实例调用callback函数)? asynchronous函数应该总是以asynchronous的方式运行,特别是对于错误条件,这有多重要? 如果知道程序不是处于asynchronous操作的适当状态,可以throw吗? 例如: function getUserById(userId, cb) { if (userId !== parseInt(userId)) { throw new Error('userId is not valid') } // make async call } // OR… function getUserById(userId, cb) { if (userId !== parseInt(userId)) { return cb(new Error('userId is not valid')) } // make async call }
编辑 继续重试直到承诺解决的模式(使用delay和maxRetries)。 继续重试直到条件符合结果(具有延迟和maxRetries)的模式。 具有无限次重试的内存高效dynamic模式(提供延迟)。 代码为#1。 不断重试,直到承诺解决(语言等任何改进社区?) Promise.retry = function(fn, times, delay) { return new Promise(function(resolve, reject){ var error; var attempt = function() { if (times == 0) { reject(error); } else { fn().then(resolve) .catch(function(e){ times–; error = e; setTimeout(function(){attempt()}, delay); }); } }; attempt(); }); }; 使用 work.getStatus() .then(function(result){ //retry, some glitch in the system […]
更新: 为了帮助这篇文章的未来观众,我创build了pluma答案的演示 。 题: 我的目标看起来相当简单。 step(1) .then(function() { return step(2); }, function() { stepError(1); return $q.reject(); }) .then(function() { }, function() { stepError(2); }); function step(n) { var deferred = $q.defer(); //fail on step 1 (n === 1) ? deferred.reject() : deferred.resolve(); return deferred.promise; } function stepError(n) { console.log(n); } 这里的问题是,如果我在第一步失败, stepError(1)和stepError(2) 。 如果我不return $q.reject那么stepError(2)将不会被触发,但是step(2)将会被理解。 […]
我正在阅读关于延期和承诺,并继续来$.when.apply($, someArray) 。 我有点不清楚这到底是什么,寻找一条线正确工作的解释(不是整个代码片段)。 这是一些背景: var data = [1,2,3,4]; // the ids coming back from serviceA var processItemsDeferred = []; for(var i = 0; i < data.length; i++){ processItemsDeferred.push(processItem(data[i])); } $.when.apply($, processItemsDeferred).then(everythingDone); function processItem(data) { var dfd = $.Deferred(); console.log('called processItem'); //in the real world, this would probably make an AJAX call. setTimeout(function() { dfd.resolve() […]