我正在尝试在Angularjs中testing基于承诺的代码。 我在我的控制器中有以下代码: $scope.markAsDone = function(taskId) { tasksService.removeAndGetNext(taskId).then(function(nextTask) { goTo(nextTask); }) }; function goTo(nextTask) { $location.path(…); } 我想unit testing下列情况: 当markAsDone被调用时,它应该调用tasksService.removeAndGetNext 当tasksService.removeAndGetNext完成时,它应该改变位置(调用goTo ) 在我看来,没有简单的方法来分别testing这两种情况。 我所做的testing第一个是: var noopPromise= {then: function() {}} spyOn(tasksService, 'removeAndGetNext').andReturn(noopPromise); 现在来testing第二种情况,我需要创build另一个假的承诺,将永远resolved 。 这是非常乏味的,这是很多的样板代码。 有没有其他方法来testing这样的事情? 或者我的devise味道?
像q这样的承诺/推迟库如何实现? 我正在尝试阅读源代码,但发现它很难理解,所以我认为如果有人能够从高层向我解释什么是在单线程JS环境中实现promise的技术像Node和浏览器。
我有一个简单的控制器使用$资源: var Regions = $resource('mocks/regions.json'); $scope.regions = Regions.query(); 我在一个指令中使用这个控制器(在链接函数中) var regions = scope.regions; 但地区是不确定的。 这是相当逻辑的调用是asynchronous的。 我的问题是我怎么能等待结果和地区是一个数组与所有数据? 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 regions) {} }; });
在当前版本的Node.js中是否有对promise的本地支持? Node.js使用V8引擎。 Chrome浏览器也使用这个JavaScript引擎,Chrome 32本身也支持Promise。 但我似乎无法承诺在Node.js中工作(本地)。 我已经尝试了在Chrome 32中的以下代码,它的工作原理。 var promise = new Promise(function(resolve, reject) { // do a thing, possibly async, then… if ( 1===1 /* everything turned out fine */) { resolve("Stuff worked!"); } else { reject(Error("It broke")); } }); promise.then(function( message ) { console.log( message ); }, function( err ) { console.log( err ); […]
我有一个简单的节点模块连接到一个数据库,并有几个function来接收数据,例如这个function: dbConnection.js: import mysql from 'mysql'; const connection = mysql.createConnection({ host: 'localhost', user: 'user', password: 'password', database: 'db' }); export default { getUsers(callback) { connection.connect(() => { connection.query('SELECT * FROM Users', (err, result) => { if (!err){ callback(result); } }); }); } }; 该模块将从另一个节点模块中被调用: app.js: import dbCon from './dbConnection.js'; dbCon.getUsers(console.log); 我想用promise来代替callback来返回数据。 到目前为止,我已经阅读了以下线程中的嵌套承诺: 使用嵌套承诺编写干净的代码 ,但找不到任何足够简单的解决scheme。 使用承诺返回result的正确方法是什么?
在我的Angular.js应用程序中,我正在运行一些asynchronous操作。 在开始之前,我用模态div覆盖应用程序,然后一旦操作完成,我需要删除div,无论操作是否成功。 目前我有这个: LoadingOverlay.start(); Auth.initialize().then(function() { LoadingOverlay.stop(); }, function() { LoadingOverlay.stop(); // Code needs to be duplicated here }) 它工作得很好,但我宁愿有一些像这样的伪代码清洁: LoadingOverlay.start(); Auth.initialize().finally(function() { // *pseudo-code* – some function that is always executed on both failure and success. LoadingOverlay.stop(); }) 我认为这是一个很常见的问题,所以我认为可以做,但在文档中找不到任何东西。 任何想法,如果可以做到?
期货和承诺都会阻止,直到他们计算出它们的价值,那么它们之间的区别是什么?
我明白,通常在使用promise的时候,只需要使用then()调用和连锁行为来附加延续代码。 但是,我想要启动承诺封装的asynchronous调用,然后单独启动一个3秒的$timeout()以便我可以执行UI操作,只有在原始承诺尚未完成的情况下。 (我预计这只会发生在连接速度慢,3G上的移动设备等) 有了承诺,我可以检查是否完整或没有阻塞或等待?
下面的testingperformance得很奇怪: it('Should return the exchange rates for btc_ltc', function(done) { var pair = 'btc_ltc'; shapeshift.getRate(pair) .then(function(data){ expect(data.pair).to.equal(pair); expect(data.rate).to.have.length(400); done(); }) .catch(function(err){ //this should really be `.catch` for a failed request, but //instead it looks like chai is picking this up when a test fails done(err); }) }); 我应该如何妥善处理被拒绝的承诺(并testing)? 我应该如何正确处理一个失败的testing(即: expect(data.rate).to.have.length(400); 这是我正在testing的实现: var requestp = require('request-promise'); […]
我对未来和承诺之间的区别感到困惑。 显然,他们有不同的方法和东西,但是实际的用例是什么? 是吗?: 当我pipe理一些asynchronous任务时,我将来会用“未来” 当我是asynchronous任务时,我使用promise作为返回types,以允许用户从我的承诺中获得未来