2016-11-01 3 views
1

工場は何も返さず、単にjsonファイルに書き込みます。この場合、$ qを使って書き込みが完了したことを確認する方法はわかりません。

Iは、コールバックを使用する場合でも、コードが正しい順序で実行されないので、これは、これがあっても、コントローラの機能の一例である

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が実行される前に書き込まれません。これはトラブルのヒープを引き起こします。 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

非常に感謝されると思います。しかし、あなたはあなたの約束を使用する必要がある - これは、あなたが ".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); 
}); 
+0

ありがとうございました、私は何時間も約束を読んだが、それはまだ非常に混乱している。 – joropicha

関連する問題