私はBluebirdの約束を学んでおり、私はもはやDeferred()を使用しないことを学んでいます。 以下のコードは100%正確かつ意図通りに動作します。 これは、Deferredソリューションを使用するのではなく、Bluebirdの約束を使用するコードをリファクタリングするための私の練習です。 私は約束について(正確に)違った考え方を学ぶためにしようとしているが、多くの試行の後、私はまだのDeferredの助けを借りずにここ以下、この特定の問題を解決する方法を見つけ出すことはできません。Bluebird Promisesを使用して、延期されたアンチパターンでこれを解決するにはどうすればよいですか?
アイデアはありますか?
1)あなたのコンソールでこのプログラムを実行します。ここでは
は、それを実行する方法です。これは、別のコンソールウィンドウにそれをもう一度実行後)ポート8080
2を使用するのWebSocketサーバーを起動します。その1は3の後に約束したプログラミングの3年間でポート8080
// Initialization stuff
const WebSocket = require('ws');
var wsServer;
// Main Program
// =================================================================
tryCreateWebsocket().then(
function(){
console.log("Websocket succesfully initialized.");
},
function(){
console.log("Websocket startup has failed!");
}
);
// =================================================================
// Helper function: Creating a websocket, with a port as parameter
function createWebsocket(port){
return new Promise(function(resolve, reject){
wsServer = new WebSocket.Server({
perMessageDeflate: false,
port: port
});
wsServer.on("error", reject);
wsServer.on("listening", resolve);
});
}
// Main function: I try to create a websocket on 5 different ports with a resursive function
function tryCreateWebsocket(attempt, myMainDfd){
if(typeof attempt === "undefined"){
attempt = 1;
myMainDfd = deferred();
}
var ports = [8080, 8080, 8080, 8081, 8082]; // In the 2nd client, this should fail until port 8081
var curPort = ports[attempt - 1];
var maxAttempts = 5;
createWebsocket(curPort)
.then(
function(){
myMainDfd.resolve(); // Success
},
function(err){ // Error, retry
if(attempt != maxAttempts){
console.log("- attempt " + attempt + " failed. Retry");
tryCreateWebsocket(++attempt, myMainDfd);
}else{
myMainDfd.reject();
}
}
);
return myMainDfd.promise;
}
// Helper Function: I'm still using deferreds for now
function deferred() {
var resolve, reject;
var promise = new Promise(function() {
resolve = arguments[0];
reject = arguments[1];
});
return {
resolve: resolve,
reject: reject,
promise: promise
};
}
[this fiddle](https://jsfiddle.net/pk50ks04/)のようになりますか? –
@JaromandaX - 今あなたのコメントに気づいた。それが動作するようには思えませんが、事実にもかかわらず、それは本当に短いときちんと見ている、私はそのことについて申し訳ありません:-) –
を1つを考え出す苦労を持っています - 私は2つの小さなミスを犯し –