2016-11-01 3 views
1

Завод ничего не возвращает, он просто пишет в файл 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); 

}); 

Это пример функции контроллера, даже если есть обратный вызов, JsonWrite не записывается до выполнения StateChanger.changeState. Это вызывает кучу неприятностей. Если я поставлю $ timeout на 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(); 

}; 

Если кто-то может дать мне представление о том, что может быть сделано, я был бы очень благодарен

ответ

1

Ваш завод выглядит отлично. Но вы должны использовать свое обещание - это означает, что вы должны использовать «.Затем()» синтаксис:

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

Посмотрите на эти примеры: https://docs.angularjs.org/api/ng/service/ $ д

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); 
}); 
+0

Спасибо, Я читал о обещаниях часами, это все еще очень запутанно. – joropicha

Смежные вопросы