Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.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 AngularJS中的生产者-消费者队列_Javascript_Angularjs_Producer Consumer - Fatal编程技术网

Javascript AngularJS中的生产者-消费者队列

Javascript AngularJS中的生产者-消费者队列,javascript,angularjs,producer-consumer,Javascript,Angularjs,Producer Consumer,几年前我就知道python和数据库了 但是我想提高我有限的JavaScript知识。对于我的玩具项目,我想在web浏览器中使用一个异步队列,并使用AngularJS 在python中有一个很好的类,我以前使用过这个类 现在我搜索类似的东西,但是在AngularJS中 步骤1:in队列提取工作项(粉红色圆圈)。只是一个json字节的视图 步骤2:用户处理数据 步骤3:输出队列负责将结果发送到服务器 为什么会出现这种“复杂”的设置?因为我希望应用程序尽可能响应。in队列应该预加载一些数据

几年前我就知道python和数据库了

但是我想提高我有限的JavaScript知识。对于我的玩具项目,我想在web浏览器中使用一个异步队列,并使用AngularJS

在python中有一个很好的类,我以前使用过这个类

现在我搜索类似的东西,但是在AngularJS中

  • 步骤1:in队列提取工作项(粉红色圆圈)。只是一个json字节的视图

  • 步骤2:用户处理数据

  • 步骤3:输出队列负责将结果发送到服务器

为什么会出现这种“复杂”的设置?因为我希望应用程序尽可能响应。in队列应该预加载一些数据,out队列应该处理响应通信

另一个好处是,通过这种设置,应用程序可以在几分钟内处理服务器或网络中断

AngularJS的双向数据绑定可以立即更新用户编辑的数据,这与我的问题不太相符。或者我错过了什么。我对AngularJS是新手

图中的粉红色圆圈表示JSON数据结构。我想用一个请求将它们推送到浏览器

例如:

用户看到一个问题,然后他需要填写三个字段。例如:

  • 答:输入文本
  • 比如这个问题:1到5的整数
  • 难度:1到5的整数
数据应在按下“提交”后放入队列。他应该马上回答下一个问题

问题:

AngularJS是否已经有生产者-消费者队列可用?若否,如何落实?

更新

从客户端发送数据可以使用普通AJAX实现。预取数据的队列是更复杂的部分。尽管两者可以使用相同的实现。客户机以超低延迟获取新数据非常重要。in队列每次最多应填充5项,以避免客户端等待数据

在我的例子中,浏览器是否关闭以及In队列中的项目是否丢失并不重要。在服务器部件上,填写in队列是只读的

我不喜欢安格拉斯。如果有充分的理由,我很乐意改变框架


保留浏览器重新加载之间的队列可以通过localStorage(html5)来完成。

我会研究承诺,因为它们提供了您似乎需要的异步功能,可能会在初始阶段引入所有或一些问题。如果你真的需要离线访问服务人员,尽管他们只限于较新的浏览器

如果你不能使用服务人员,你可以创建一个服务(或工厂)来保存你所有的问题或提前阅读。如果在再次建立网络连接之前无法使用现有的答案,您可以使用$http服务尝试获取更多答案

例如,可以使用$http服务在$interval的循环中尝试获取新答案(并发布答案),从而检查网络

应用程序结构: 2个数组,一个带问题,另一个带答案

应用程序启动: 两个$interval对象,其中一个从服务器获取前10个问题。如果问题缓冲区长度<10,则会有新问题将其推送到数组中

另一个函数检查应答数组,如果通信可用,则将结果发送给服务器

当用户检查一个问题时,它会从第一个数组中弹出,并推入应答数组

就这些。。angular 2-ways数据绑定通过调用应用程序中的函数(如GiveMethRelatestQuestion)显示最古老的问题

希望有帮助

-后端服务仅用于模拟rest接口;我修复了一些错误,比如错误限制。所以,假设Plunker是最后一个版本

我没有足够的时间来改进下面的内容,但是,您可以假设这是一个起点

顺便说一下,我认为你需要:

  • 包装$http的服务
  • 当我们需要注册一个任务时,我们将使用一种方法推送
  • 一种递归的私有方法\u每个一步一步地减少注册队列
  • …您认为重要的所有其他内容(getCurrentTask、removeTask、ecc)

  • 用法:
    angular
    .module('myApp',['Queue']))
    .controller('MyAppCtrl',函数($httpQueue,$scope){
    var vm=$scope;
    //使用route.resolve可能会更好!
    $httpQueue
    .pull()
    .then(函数(任务){vm.tasks=tasks;})
    .catch(函数(){vm.tasks=[{name:'',description:''}];})
    ;
    vm.onTaskEdited=函数(事件、任务、表单){
    event.preventDefault();
    if(form.$invalid | | form.$pristine){return;}
    返回$httpQueue.push(任务);
    };
    })
    ;
    
    重新思考一下,您的前端真的需要生产者-消费者吗? 在您的示例中,我认为在这种情况下,一个简单的
    pub sub
    $Q
    就足够了

    例如:

    在您的示例中,创建一个订阅服务,
    questionHandlerService
    ,订阅提交的事件
    问题
    ,在您的
    questionService
    中,当用户提交问题时,只需发布带有数据的事件
    提交的问题
    。您无需等待来自
    问题处理服务的响应

    请记住,javascript中只有一个主线程,如果您的方法将阻止ui,比如
    循环数组中的1000个项目,同步处理它们,那么如果将它们放入另一个主线程中,则没有任何帮助