Javascript Angular JS:按顺序处理承诺(无链接)

Javascript Angular JS:按顺序处理承诺(无链接),javascript,angularjs,Javascript,Angularjs,这类似于问题,但没有链接 背景: 我有一个非常健谈的API,每次按键都会返回一些JSON,有时这些请求会以错误的顺序返回(按键速度非常快)。链接承诺似乎是一个合理的解决方案,但我想知道是否有一个很好的方法来解决这个问题而不使用链接?(并且不知道有关请求/消息的任何详细信息) 我在这里编写了一个使用超时的示例: 及以下 var myModule=angular.module('myModule',[]); 工厂('HelloWorld',函数($q,$timeout){ var getSlowFi

这类似于问题,但没有链接

背景:
我有一个非常健谈的API,每次按键都会返回一些JSON,有时这些请求会以错误的顺序返回(按键速度非常快)。链接承诺似乎是一个合理的解决方案,但我想知道是否有一个很好的方法来解决这个问题而不使用链接?(并且不知道有关请求/消息的任何详细信息)

我在这里编写了一个使用超时的示例:

及以下

var myModule=angular.module('myModule',[]);
工厂('HelloWorld',函数($q,$timeout){
var getSlowFirstMessage=函数(){
var deferred=$q.deferred();
$timeout(函数(){
延迟。解析(“慢第一条消息”);
}, 2000);
回报。承诺;
};
var getFastSecondMessage=函数(){
var deferred=$q.deferred();
$timeout(函数(){
deferred.resolve('Fast Second Message');
}, 1000);
回报。承诺;
};
返回{
getSlowFirstMessage:getSlowFirstMessage,
getFastSecondMessage:getFastSecondMessage
};
});
控制器('HelloCtrl',函数($scope,HelloWorld){
$scope.messages=[];
HelloWorld.getSlowFirstMessage().then(函数(消息){
$scope.messages.push(消息);
});
HelloWorld.getFastSecondMessage().then(函数(消息){
$scope.messages.push(消息);
});
});
信息
  • {{message}

我将使用异步库中的队列,该库位于以下位置:

如果您将并发性设置为1,它只会以串联方式完成所有操作。看看这个例子

myModule.controller('HelloCtrl', function ($scope, HelloWorld, $timeout) {

$scope.messages = [];   

var q = async.queue(function (task, callback) {
    task().then(function(message){
        $timeout(function(){
            $scope.messages.push(message); 
            callback();
        });
    });
}, 1);


// assign a callback
q.drain = function() {
    console.log('all items have been processed');
}

// add some items to the queue

q.push(HelloWorld.getSlowFirstMessage, function (err) {
   console.log('finished processing slow');
});
q.push(HelloWorld.getFastSecondMessage, function (err) {
   console.log('finished processing fast');
});

});

这是一把有效的小提琴:

您是否尝试过限制消息,使其不会触发得如此之快,可能是每250毫秒或键盘上的某个时间触发一次?不太确定您想要完成什么,但这是您的想法吗@卢卡斯所有的问题是,它等待它们全部完成。关于如何使用队列,请参阅我的答案。@JonathanRowny好吧,使用队列的缺点是它以串行方式执行所有操作。当我的程序在等待它们全部完成时,它是并行的,所以它实际上比串行的要快。@Lukas true,但在他的情况下,当你在键入时添加承诺时,你需要某种队列,你不知道你提前有多少承诺。很酷,谢谢,我给了你正确的答案。但是,您知道这两条消息是否都可以异步执行,然后在回调中按顺序返回吗?(看起来好像两条消息同时返回)或者这是一种滥用javascript的行为?老实说,我不确定如果您启动并发性,队列是否会按顺序返回它们,但我认为不会。您当然可以基于Async编写自己的代码,Async的行为与您描述的完全相同,它将结果放置在数组中,只有在达到正确的顺序时才会弹出结果。也许这已经存在了,我只是不知道而已。