2016-05-16 7 views
0

socket.ioで動作するpromiseを作成したいと思います。私は現在、コールバックが応答に対処するために設定されています:

function request(event, data, callback) { 
    socket.emit(event, data); 
    socket.on(event, function(d) { 
     socket.off(event); 
     callback(d); 
    }); 
} 

私が何か書くためにこの力:我々は(角度から$ qをサービスと)約束を使用することができれば、私は疑問に思う

request('myEvent', 'Hello World !', function(data) { 
    ... 
}); 

を:

request('myEvent', 'Hello World !').then(function(data) { 

}); 

ありがとうございます!

+0

も約束することができますのみ:socket.on(「検索」)あなたはこのような何かを行うことができますから、今のデータを取得するには解決するか、拒否する。イベントは一度より多く起こるでしょうか?それが起こった場合は気になりますか? –

+0

イベントが1つずつ発生するとしましょう。 – Arpp

答えて

2

あなたは次にあなたが唯一の解決やものを拒否することができ

request('myEvent', 'Hello World !').then(function(data) { 

}); 
+0

パーフェクト!ありがとうございました :)。 – Arpp

1
function request (eventName, data) { 
    return $q(function (resolve, reject) { 
    socket.emit(eventName, data); 
    socket.on(eventName, function (data) { 
     socket.off(eventName); 
     resolve(data); 
    }); 
    }); 
} 
1

も約束を使用することができます

function request(event, data) { 
    var deferred = $q.defer(); 
    socket.emit(event, data); 
    socket.on(event, function(d) { 
     socket.off(event); 
     deferred.resolve(d); 
    }); 
    return deferred.promise; 
} 

ような何かを試すことができます。イベントは一度より多く起こるでしょうか?

あなたのイベントで1時間だけあなたが大丈夫なら、あなたはそれを確約することができます。

function request(event, data, callback) { 
    socket.emit(event, data); 
    socket.on(event, function(d) { 
     socket.off(event); 
     callback(d); 
    }); 
} 

は次のようになります。

function request(event, data) { 
    return $q(function(resolve, reject) { 
     socket.emit(event, data); 
     socket.on(event, function(d) { 
      socket.off(event); 
      resolve(d) 
     }); 
    }); 
} 

あなたはそれを使用します:

request('event', data).then(....) 
0

私は機能にsocket.on(イベント)をラップし、より機能の詳細を呼び出すときに問題を抱えていました一度それらの複数を開きます。したがって、バックエンドが特定のソケットイベントを呼び出すと、socket.on(event)が複数回呼び出されます。これを修正した場合は、$ rootScope。$を使用して$インスタンスを1つだけ持つことができます。

this.search = (query) => { 

    var deferred = $q.defer(); 

    socket.emit('search', {query: query}) // send data to backend 

    $rootScope.$on('search', function(event,data){ 

     deferred.resolve(data); 

    }); 

    return deferred.promise; 
} 

//get data back from backend 
socket.on('search',(data) => { 

    $rootScope.$emit('search',data); 

}); 

ホールコードはAngularjsサービス内にラップされています。

SocketioService.search('Some query').then((data) => { 
    //do something with the data from the backend 
}) 

ない、これが最善の解決策ですが、それが動作するかどうか確認してください:)