在下面的代码中: var p1 = new Promise(function (resolve, reject) { throw 'test1'; }); var p2 = new Promise(function (resolve, reject) { reject('test2'); }); p1.catch(function (err) { console.log(err); // test1 }); p2.catch(function (err) { console.log(err); // test2 }); 使用Promise api中的reject (在p2 )和抛出一个使用throw的错误(在p1 )是否有区别? 它完全一样? 如果它一样,为什么我们需要rejectcallback呢?
我使用ES6承诺来pipe理我所有的networking数据检索,并且在某些情况下我需要强制取消它们。 基本上这种情况是这样的,我有一个提前input的search请求被委托给后端的用户界面必须执行基于部分input的search。 虽然这个networking请求(#1)可能需要一点时间,但是用户继续键入,最终触发另一个后端呼叫(#2) 这里#2自然优先于#1,所以我想取消承诺包装请求#1。 我已经有了数据层中所有Promise的caching,所以理论上我可以检索它,因为我试图提交#2的Promise。 但是,如果我从caching中检索到Promise#1,我该如何取消呢? 任何人都可以提出一个办法
我想有一个for循环每次迭代调用asynchronous函数。 在for循环之后,我想执行另一个代码块,但不是在for循环中的所有先前的调用已经解决之前。 我现在的问题是,在for循环之后的代码块在所有的asynchronous调用完成之前被执行,或者根本不执行。 代码部分用FOR循环和后面的代码块(完整的代码,请看小提琴 ): [..] 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 promise = promise.then(function() { […]
为了更好地理解Javascript中承诺的工作原理,我决定尝试一下,并自己编写基本的实现代码。 基本上我想实现Promises对象(我称之为代码中的Aaa),它将函数作为参数。 这个函数可以调用resolve来resolve promise,或拒绝reject 。 基本的实现和用法如下。 不知道第二个参数是否可以按照诺言规格接受,但这是我迄今为止。 Aaa=function(f,pause) { console.log("ggg"); var t=this; this.f=f; this.thens=[]; this.resolve=function(g) { for(var i=0;i<t.thens.length;i++) { // try/catch to be used later for dealing with exceptions try { t.thens[i].f(g); t.thens[i].resolve(); } catch(ex) {} } }; // to be implemented later this.reject=function(g) {}; this.then=function(resolve,reject) { // i'm passing true for pause argument as […]
这是我在嵌套承诺的第一枪。 我正在使用蓝鸟图书馆,但我认为这个想法对所有的承诺库都是一样的。 在高层次上,这是我想要做的: myService.getSomeData(url) .then((data) => { myOtherService.getMoreData(data.uniqueId) .then((thisDataIsAnArray) => { //loop over the data above and do something }); }); getMoreData()应该使X服务调用并将结果存储在数组X元素long中。 这是我开始迷失的地方,因为我不知道如何制定这个方法,我应该从中返回。 我已经对蓝鸟的Promise.all和Promise.map采取了一些刺激,但我很挣扎,并认为我会征求意见。
假设我有这个代码 function y(resolve, reject) { console.log("Result"); resolve(); } var promise = new Promise(y); 我想知道的是函数y是否会被asynchronous执行。
我有和expressjs应用程序,并在特定的路线我调用一个函数,通过调用res.json与数据库文件作为参数与数据库中的用户响应。 我使用基于承诺的库,我想内联的callback,我把数据库文件的响应。 但是当我这样做的时候程序就会失败。 有人可以解释为什么吗? 我也想知道为什么内联调用console.log实际上工作。 两个方法res.json和console.log之间有一些根本的区别吗? 这是一个什么工作,什么不工作的例子。 假设getUserFromDatabase()返回用户文档的承诺。 //This works var getUser = function(req, res) { getUserFromDatabase().then(function(doc) { res.json(doc); }); } //This does not work (the server never responds to the request) var getUserInline = function(req, res) { getUserFromDatabase().then(res.json); } //This works (the object is printed to the console) var printUser = function(req, res) { […]
我有一个$.ajax承诺,并希望检查我的(语法有效)响应是否包含错误,在这种情况下触发拒绝状态。 我曾经和我自己的承诺库很容易地处理这些任务。 我真的不喜欢jQuery的Promise ( caching )实现与Deferred对象 ,可能忽略了一些东西,因为我很less使用它。 我认为要走的路只是使用.then() ,这似乎相当复杂: return $.ajax(…).then(function success(response) { var problem = hasError(response); if (problem) { var error = new $.Deferred; error.reject(problem); return error; } else return response; }); 这应该返回一个承诺,在networking错误或响应问题的情况下被拒绝。 但是是否真的返回被拒绝的方式呢? 我也会在如何处理这些“错误抛出响应处理程序”的ajax选项本身提供帮助,我找不到有关它们的好文档。 免责声明:不,我不能改变服务器的回应。 问题检测方法是同步的。 我不想使用其他库,我对jQuery解决这个问题的方式特别感兴趣。
假设我有以下代码。 function divide(numerator, denominator) { return new Promise((resolve, reject) => { if(denominator === 0){ reject("Cannot divide by 0"); return; //superfluous? } resolve(numerator / denominator); }); } 如果我的目标是尽早使用reject退出,那么我是否应该养成立即return的习惯?
量angular器有很多不稳定的情况,我确信有一些我不明白的地方。 有时我需要在继续之前点击button来使用.then(),有时不会有任何影响,我不应该使用.then()或者testing失败。 我想知道什么时候应该在量angular器中testing时使用.then()callback? 例如: createAccountForm = $('#form-create-account'); submitButton = createAccountForm.$('button[type=submit]'); browser.wait(EC.elementToBeClickable(submitButton), 5000); submitButton.click(); // .then(function(){ <– uncomment in the .then form // find the confirmation message var message = $('.alert-success'); browser.wait(EC.visibilityOf(message), 5000); log.debug('After visibilityOf'); expect(message.isPresent()).to.be.eventually.true; // }); –> uncomment when in .then form 当我使用这种forms的testing(没有.then()),我看到在浏览器上点击button没有完成 ,testing继续下面的期望,然后停止。 如果我使用.then()表单,点击button完成 ,并且testing继续没有错误。 在其他testing中,当点击button时,我不需要使用then()callback。 那么,什么时候应该使用.then(),什么时候不使用? 让 – 马克