1

これは質問17757654に似ていますが、連鎖はありません。

背景:
私は、キーを押すたびに JSON を返す非常におしゃべりな API を持っていますが、これらの要求が間違った順序で返されることがあります (非常に速くキーを押すと)。promise の連鎖は合理的な解決策のように思えますが、連鎖せずにこれを解決する良い方法があるかどうか疑問に思っていましたか? (そして、リクエスト/メッセージに関する詳細を知らずに)

ここでタイムアウトを使用した例を書きました: 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>
4

1 に答える 1

2

ここにある非同期ライブラリの Queue を使用します: 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/

于 2013-09-26T17:42:49.423 に答える