문제

나는 새로운 자바스크립트,그리고 아직 익숙하지 않으로 비동기 기능에...

난 작업 node.js 을 만들팅 server,이 부분의 내 코드는 듣 getListConnected 이벤트 때 그것은 그것을 트리거 모든 연결 clients 에서 특정 네임스페이스,그리고 다음 각 클라이언트에 대해 저장 자신의'사용자 이름'또 다른 배열로 변환 json 으로 응답과 다음 보낼:

socket.on('getListConnected', function(msg){
                        var clients = namespace.clients();//get all client in that nsp
                        var usernames = Array() ;//init array

                        for(i in clients)//for each clients
                        {
                           clients[i].get("username", function(value){
                               usernames.push(value);
                            });
                        }
                       socket.emit('getListConnected',JSON.stringify(usernames));//send
                    });

이 문제 코드는 클라이언트입니다.get()메소드는 비동기는 마녀는 사용자 이름 보낸다.

어떻게 기다리는 사용자 이름을 때까지 그것의 가득하거나,어떻게 기다리는 루프에 완료 될 때까지?

도움이 되었습니까?

해결책

당신이 사용할 수 있었을 위한 미들웨어 약속,같은 뭔가 Bluebird, 또는 당신을 유지할 수 있는 카운터를 확인하려면 모든 사용자 이름 받고있가

socket.on('getListConnected', function (msg) {
    var clients   = namespace.clients();
    var usernames =  [];
    var counter1  =  0;
    var counter2  =  0;

    for (i in clients) {

        counter1++; // number of clients

        clients[i].get("username", function (value) {
            usernames.push(value);
            counter2++; // number of clients added to array

            if (counter1 === counter2) {
                socket.emit('getListConnected', JSON.stringify(usernames));
            }

        });
    }

});

다른 팁

여기에는 블루버드를 들어,을 위해 주문을 받아서 만들어 귀하의 상황:[빌려서 빅터 퀸의 예]

를 사용하여 동일한 약속을 정의하는 빅 사용:

var Promise = require('bluebird');

var promiseWhile = function(condition, action) {
    var resolver = Promise.defer();

    var loop = function() {
        if (!condition()) return resolver.resolve();
        return Promise.cast(action())
            .then(loop)
            .catch(resolver.reject);
    };

    process.nextTick(loop);

    return resolver.promise;
};

인스턴스화와 함께 사용자 지정:

var i = 0;
promiseWhile(function() {
    return i < clients.length;
}, function(value) {
    return new Promise(function(resolve, reject) {
        clients[i].get("username", function(value){
                                       usernames.push(value);
            });
            i++;
            resolve();
    });
}).then(function() {
    console.log("usernames are: " + usernames);
});
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top