javascript - 无法让 Angular 工厂中的 $q promise 正常工作

标签 javascript angularjs node.js

工厂不返回任何内容,它只是写入 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/

相关文章:

javascript - 如何获取动态创建的DropDownList的ID并检查其值是否改变?

javascript - 使用 PHP MySQL 和 Java 进行动态下拉

javascript - 使用Raphael js直接在google maps上绘制

javascript - Pristine 不检测表单内的表单(指令)

javascript - 用户界面路由器 : Keep url after $stateChangeError (while resolving dependencies)

node.js - Systemd 服务启动失败

node.js - NodeJS导入与文件夹同名的文件

javascript - Vue.js - 使用过滤器更新父数据

javascript - 从模型中删除项目时不会更新表单验证。漏洞?

node.js - 使用椭圆曲线 key 创建服务器和客户端时使用 Node JS TLS 密码短语和密码选项(无共享密码套件错误)