工厂不返回任何内容,它只是写入 json 文件。我不知道在这种情况下如何使用 $q 来确保它已完成写入。
这导致我在 Controller 中出现问题,因为即使我使用回调,代码也不会按正确的顺序执行。
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);
});
这是 Controller 函数的示例,即使有回调,JsonWrite 在 StateChanger.changeState 执行之前也不会完成写入。这会带来很多麻烦。如果我在 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();
};
如果有人能给我一个关于可以做什么的想法,我将非常感激
最佳答案
你们的工厂看起来不错。但你需要使用你的 promise - 这意味着你需要使用“.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 promise 正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40360423/