Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Promise指示某些已完成标准的服务_Javascript_Angularjs_Angularjs Service - Fatal编程技术网

Javascript 使用Promise指示某些已完成标准的服务

Javascript 使用Promise指示某些已完成标准的服务,javascript,angularjs,angularjs-service,Javascript,Angularjs,Angularjs Service,我们在一个应用程序中有几个控制器,用于几个不同的选项卡/页面。 我想有一些机制来表明某件事是在其中一个时间内完成的 它们可用于其他控制器。应该是这个机制,, 所以我正在努力掌握它 我在那里玩过,得到了一些我想要的东西,但是我对服务的结果不是很满意 如果我有以下html: <div ng-app="myApp"> <div ng-controller=myController1> Fill in this field: <input type=

我们在一个应用程序中有几个控制器,用于几个不同的选项卡/页面。 我想有一些机制来表明某件事是在其中一个时间内完成的 它们可用于其他控制器。应该是这个机制,, 所以我正在努力掌握它

我在那里玩过,得到了一些我想要的东西,但是我对服务的结果不是很满意

如果我有以下html:

<div ng-app="myApp">
    <div ng-controller=myController1>
        Fill in this field: <input type="text">
        <input type="submit" value="Done" ng-click="submit()">
    </div>
    <div ng-controller=myController2 ng-show="done1">
        And this field: <input type="text">
        <input type="submit" value="Done" ng-click="submit()">
    </div>
    <div ng-controller=myController3 ng-show="done2">
        As well as this field: <input type="text">
        <input type="submit" value="Done" ng-click="submit()">
    </div>
</div>
那么我对结果其实是满意的,“问题”就在于执行 服务:

my_module.factory('Done1Service', function ($q) {
    var deferred = $q.defer();
    var get_promise_fn = function () {
        return deferred.promise;
    };
    var done_fn = function () {
        console.log("I'm done!");
        return deferred.resolve(true);
    };
    return {
        get_promise: get_promise_fn,
        done: done_fn
    };
});

my_module.factory('Done2Service', function ($q) {
    ... // identical except console.log("I'm done again!")
});

my_module.factory('Done3Service', function ($q) {
    ... // identical except console.log("I'm done at last!");
});
这些感觉有点过于陈词滥调,我想知道我是否做错了什么。 我可以创建一个公共服务并创建三个实例吗?这是正常的方式吗 通过从专用的get_promise函数返回承诺来处理此问题(
我认为这可能会被称为“其他东西”)

就目前而言,您的服务是一次性的,因为承诺无法重置。我认为您可以通过使用单个
EventBus
服务来解决这个问题,每个控制器都可以通过该服务进行通信。例如,第一个控制器在总线上发送一条“step1completed”消息,该消息被第二个控制器截获,第二个控制器执行其工作并触发“step2completed”事件,等等

如果有许多相同的进程必须并行运行,则可以允许创建多个
EventBus
实例,作为一组特定对象的独立通信通道


Angular已经允许您通过作用域发射或广播事件,查看和。

单次方面实际上适合我的需要,并且它们不像示例中那样被链接,这只是我为了测试而做的东西。我想我最终会使用承诺,但我会接受这个答案,因为它为问题中的示例提供了一个可能的解决方案。
my_module.factory('Done1Service', function ($q) {
    var deferred = $q.defer();
    var get_promise_fn = function () {
        return deferred.promise;
    };
    var done_fn = function () {
        console.log("I'm done!");
        return deferred.resolve(true);
    };
    return {
        get_promise: get_promise_fn,
        done: done_fn
    };
});

my_module.factory('Done2Service', function ($q) {
    ... // identical except console.log("I'm done again!")
});

my_module.factory('Done3Service', function ($q) {
    ... // identical except console.log("I'm done at last!");
});