我有一個webworker爲我做一些工作。 我已經將它包裝到一個服務中,並且此webworker在Promise中執行。使用webworker測試q.defer(),如何防止計時問題?
現在我用Jasmine測試了這個,看起來測試結束後答應了。
這裏的難點在於延遲和webworker在不同的時間點都是異步的。
我試過用異步茉莉花完成setTimeout $ scope。$ apply()。但'deferred.resolve(e.data.filtered)''在所有這些定時器都被掛起之後被調用。
我的角度服務是這樣的:
'use strict';
angular.module('app.demographics').service('FilteringService', FilteringService);
FilteringService.$inject = ['$q'];
function FilteringService($q) {
this.filter = function (dataSet, filters) {
var deferred = $q.defer();
var worker = new Worker('my.worker.js');
var filterData = {
dataSet: dataSet,
filters: filters
};
worker.postMessage(filterData);
worker.onmessage = function (e) {
if (e.data && e.data.ready) {
deferred.resolve(e.data.filtered);
}
};
worker.onerror = function (e) {
console.log("something went wrong while filtering: ", e);
deferred.reject(e);
};
return deferred.promise;
};
}
而且我的測試是這樣的,我希望能夠正常工作,但是它永遠不會到來的預期。
'use strict';
describe('FilteringService: ', function() {
var filteringService, $q,
dataSet = [{a: 1, b: 2}, {c: 3, d: 4}],
filters = [];
beforeEach(function() {
module('app.demographics');
inject(function (_$rootScope_, _FilteringService_, _$q_) {
filteringService = _FilteringService_;
$q = _$q_;
});
});
it('should return a promise on filtering', function() {
var filteringPromise = filteringService.filter(dataSet, filters);
filteringPromise.then(function (data) {
expect(data.length).toEqual(dataSet.length);
}, function (failure) {
fail(failure);
});
});
});