我已经阅读了关于这个主题的几篇文章,但是我还不清楚Promise.reject和抛出一个错误是否有区别。 例如, 使用Promise.reject return asyncIsPermitted() .then(function(result) { if (result === true) { return true; } else { return Promise.reject(new PermissionDenied()); } }); 使用throw return asyncIsPermitted() .then(function(result) { if (result === true) { return true; } else { throw new PermissionDenied(); } }); 我的select是使用throw因为它更短,但想知道是否有优势。
我仍然是相当新的承诺,目前正在使用蓝鸟,但我有一个情况,我不太清楚如何最好地处理它。 因此,例如我有一个快速应用程序中的承诺链如下所示: repository.Query(getAccountByIdQuery) .catch(function(error){ res.status(404).send({ error: "No account found with this Id" }); }) .then(convertDocumentToModel) .then(verifyOldPassword) .catch(function(error) { res.status(406).send({ OldPassword: error }); }) .then(changePassword) .then(function(){ res.status(200).send(); }) .catch(function(error){ console.log(error); res.status(500).send({ error: "Unable to change password" }); }); 所以我后面的行为是: 去Id获得帐户 如果在这一点上被拒绝,就会炸毁并返回一个错误 如果没有错误,则将返回的文档转换为模型 validation数据库文档的密码 如果密码不匹配,然后炸出来,并返回一个不同的错误 如果没有错误更改密码 然后返回成功 如果还有其他问题,请退回500 所以目前的捕获似乎并没有停止链接,这是有道理的,所以我想知道是否有一种方法让我以某种方式迫使链条停止在基于错误的某个点上,或者如果有更好的方法构造这个以获得某种forms的分支行为,因为存在if X do Y else Z 。 任何帮助将是伟大的。
我在AngularJs中使用$http ,我不确定如何使用返回的promise和处理错误。 我有这个代码: $http .get(url) .success(function(data) { // Handle data }) .error(function(data, status) { // Handle HTTP error }) .finally(function() { // Execute logic independent of success/error }) .catch(function(error) { // Catch and handle exceptions from success/error/finally functions }); 这是一个好办法吗?还是有一个更简单的方法?
我一直在使用ES6 Promise。 通常,承诺是这样构build和使用的 new Promise(function(resolve, reject){ if (someCondition){ resolve(); } else { reject(); } }); 但为了灵活性,我一直在做下面这样的事情。 var outsideResolve; var outsideReject; new Promise(function(resolve, reject) { outsideResolve = resolve; outsideReject = reject; }); 然后 onClick = function(){ outsideResolve(); } 这工作正常,但有一个更简单的方法来做到这一点? 如果不是,这是一个很好的做法?
所以我有一个情况,我有多个未知长度的承诺链。 当所有的CHAINS已经被处理时,我想要执行一些操作。 这甚至可能吗? 这里是一个例子: app.controller('MainCtrl', function($scope, $q, $timeout) { var one = $q.defer(); var two = $q.defer(); var three = $q.defer(); var all = $q.all([one.promise, two.promise, three.promise]); all.then(allSuccess); function success(data) { console.log(data); return data + "Chained"; } function allSuccess(){ console.log("ALL PROMISES RESOLVED") } one.promise.then(success).then(success); two.promise.then(success); three.promise.then(success).then(success).then(success); $timeout(function () { one.resolve("one done"); }, Math.random() * 1000); […]
我想在我的前端应用程序中使用(本机)promise来执行XHR请求,但是没有一个庞大的框架。 我想我的xhr返回一个承诺,但这是行不通的(给我: Uncaught TypeError: Promise resolver undefined is not a function ) function makeXHRRequest (method, url, done) { var xhr = new XMLHttpRequest(); xhr.open(method, url); xhr.onload = function() { return new Promise().resolve(); }; xhr.onerror = function() { return new Promise().reject(); }; xhr.send(); } makeXHRRequest('GET', 'http://example.com') .then(function (datums) { console.log(datums); });
蓝鸟提供了一个“终于”的方法,被称为无论发生在你的诺言链。 我发现它非常方便,用于清理目的(如解锁资源,隐藏装载程序…) ES6原生承诺中是否有相同的内容? 以下是Finally方法的文档参考: http://bluebirdjs.com/docs/api/finally.html 谢谢
我正在尝试编写一个返回promise的函数。 但是,有些时候所要求的信息是可以立即得到的。 我想把它包装在一个承诺,使消费者不需要作出决定。 function getSomething(id) { if (Cache[id]) { var deferred = $q.defer(); deferred.resolve(Cache[id]); // <– Can I do this? return deferred.promise; } else { return $http.get('/someUrl', {id:id}); } } 像这样使用它: somethingService.getSomething(5).then(function(thing) { alert(thing); }); 问题是,callback没有执行预先解决的承诺。 这是一个合法的事情吗? 有没有更好的方法来处理这种情况?
Future和Promise什么区别? 他们都是未来结果的占位符,但主要区别在哪里?
我看到一些使用Promise访问FB Graph API的Facebooklogin服务的例子。 示例#1 : this.api = function(item) { var deferred = $q.defer(); if (item) { facebook.FB.api('/' + item, function (result) { $rootScope.$apply(function () { if (angular.isUndefined(result.error)) { deferred.resolve(result); } else { deferred.reject(result.error); } }); }); } return deferred.promise; } 还有使用"$scope.$digest() // Manual scope evaluation"得到响应的服务 示例#2 : angular.module('HomePageModule', []).factory('facebookConnect', function() { return new function() { […]