工厂不返回任何东西,它只是写入一个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/

10-12 03:56