2013-09-26 74 views
1

這與問題17757654類似,但沒有鏈接。Angular JS:按順序處理承諾(無鏈接)

背景:
我有一個非常有趣的API,每次按鍵都會帶回一些JSON,有時這些請求以錯誤的順序返回(按下非常快的按鍵)。鏈接承諾似乎是一個合理的解決方案,但我想知道是否有一個很好的方法來解決這個問題,而無需鏈接? (並且不知道關於請求/消息的任何細節)

我在這裏使用超時寫入一個例子:http://jsfiddle.net/zakGh/

及以下,

var myModule = angular.module('myModule', []); 
myModule.factory('HelloWorld', function ($q, $timeout) { 

    var getSlowFirstMessage = function() { 
     var deferred = $q.defer(); 

     $timeout(function() { 
      deferred.resolve('Slow First Message'); 
     }, 2000); 

     return deferred.promise; 
    }; 

    var getFastSecondMessage = function() { 
     var deferred = $q.defer(); 

     $timeout(function() { 
      deferred.resolve('Fast Second Message'); 
     }, 1000); 

     return deferred.promise; 
    }; 

    return { 
     getSlowFirstMessage: getSlowFirstMessage, 
     getFastSecondMessage: getFastSecondMessage 
    }; 

}); 

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

    $scope.messages = []; 

    HelloWorld.getSlowFirstMessage().then(function (message) { 
     $scope.messages.push(message); 
    }); 

    HelloWorld.getFastSecondMessage().then(function (message) { 
     $scope.messages.push(message); 
    }); 

}); 

<body ng-app="myModule" ng-controller="HelloCtrl"> 
    <h1>Messages</h1> 

    <ul> 
     <li ng-repeat="message in messages">{{message}}</li> 
    </ul> 
</body> 
+1

你試過節流消息不會引發這麼快,也許在每一個按鍵或250ms的東西? –

+0

不完全確定你想要完成的是什麼,但是這種你在想什麼? http://jsfiddle.net/zakGh/1/ – Lukas

+0

@Lukas所有的問題是,它等待他們都完成。請參閱我的答案以瞭解如何使用隊列。 –

回答

2

我會使用隊列從異步庫在這裏找到:https://github.com/caolan/async#queue

如果將併發性設置爲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'); 
}); 

}); 

這裏的工作小提琴:http://jsfiddle.net/zakGh/4/

+0

很感謝,我給你正確的答案。但是,你知道這兩條消息是否可以在異步中執行,然後在回調中重新排序嗎? (它會看起來好像兩個郵件一次回來)或者是這種有點濫用javascript? – stefanlz

+0

說實話,我不確定隊列是否會按順序返回它們,如果你併發的話,但我會認爲不是。您當然可以編寫基於Async的自己的代碼,其行爲與您所描述的完全一樣,方法是將結果放入數組中,只有在達到正確順序時才彈出它們。也許這已經存在,我只是不知道它。 –