工厂不返回任何东西,它只是写入一个json文件。在这种情况下,我无法弄清楚如何使用$ q来确保已完成编写。
这导致我在控制器中出现问题,因为即使我使用回调,代码也不会以正确的顺序执行。
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);
});
这是控制器功能的示例,即使有回调,在执行StateChanger.changeState之前,JsonWrite也不会写完。这会引起很多麻烦。如果我在StateChanger上放置一个$ timeout,那么一切都可以正常工作-它在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);
});
关于javascript - 无法在Angular工厂中获得$ q许诺以正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40360423/