无法在Angular工厂中获得$ q保证正常工作

工厂不返回任何东西,它只是写入一个json文件。 在这种情况下,我不知道如何使用$ q来确保它已经写完了。

这是在控制器中导致我的问题,因为即使我使用callback,代码不会按正确的顺序执行..

angular.module('jsonWrite', []) .factory('JsonWrite', function($q) { var nw = require('nw.gui'); var fs = require('fs'); var path = require('path'); var file = "myjsonfile.json"; var filePath = path.join(nw.App.dataPath, file); var write = {}; write.writeJson = function(x){ var deferred = $q.defer(); fs.access(filePath, fs.F_OK, function(err) { if (!err) { fs.readFile(filePath, 'utf8', function(err, data) { var myObj = JSON.parse(data); myObj = x; fs.writeFileSync(filePath, JSON.stringify(myObj)); }); } else { fs.open(filePath, "w", function(err, data) { var myObj = {}; myObj = x; fs.writeFileSync(filePath, JSON.stringify(myObj)); }); }; $q.resolve(); }); return deferred.promise; }; return(write); }); 

这是控制器函数的一个例子,即使有callback,JsonWrite在StateChanger.changeState执行之前也没有写完。 这导致了一堆麻烦。 如果我把一个$超时在StateChanger,一切工作正常 – 它在JsonWrite写完之后执行。

 $scope.change = function(x){ function write(callback){ JsonWrite.writeJson(x); callback(); }; function change(){ writemystuff(function(){ StateChanger.changeState(); // <- $timeout here and it works }) }; change(); }; 

如果有人能告诉我可以做些什么,我会非常感激

你的工厂看起来不错。 但是您需要使用您的诺言 – 这意味着您需要使用“.then()”语法:

 write.writeJson().then(function() {StateChanger.changeState()}); 

看看这些例子: https : //docs.angularjs.org/api/ng/service/ $ q

 function asyncGreet(name) { var deferred = $q.defer(); setTimeout(function() { deferred.notify('About to greet ' + name + '.'); if (okToGreet(name)) { deferred.resolve('Hello, ' + name + '!'); } else { deferred.reject('Greeting ' + name + ' is not allowed.'); } }, 1000); return deferred.promise; } var promise = asyncGreet('Robin Hood'); promise.then(function(greeting) { alert('Success: ' + greeting); }, function(reason) { alert('Failed: ' + reason); }, function(update) { alert('Got notification: ' + update); });