Bluebird 약속을 배우고 있으며 더 이상 Deferred()를 사용하지 않는 법을 배우려고합니다. 아래의 코드는 올바르게 100 % 실행됩니다. 그러나 여기에는 Deferred 솔루션을 사용하는 대신 Bluebird 약속을 사용하도록 코드 리팩토링에 대한 연습 문제가 나와 있습니다. 약속에 대해 다르게 (올바르게) 생각하는 법을 배우려하지만, 많은 시도를 거친 후에 아래의이 특정 문제를 해결하는 방법을 알아낼 수 없으며 없이는 Deferreds의 도움을받을 수 있습니다.Bluebird Promises를 사용하여 연기 방지 패턴으로이를 해결하는 방법은 무엇입니까?
누구나 아이디어가 있습니까?
1) 콘솔에서이 프로그램을 실행 : 여기
그것을 실행하는 방법입니다. 포트 8080을 사용할 웹 소켓 서버를 부팅합니다.
2) 그런 다음 다른 콘솔 창에서 두 번째로 실행하십시오. A는 내 코드는 간단하게 지연된 사용하는 곳 하나가 부팅 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 - 지금 당신의 의견을 알아 챘습니다. 그것은 작동하지 않는 것 같지만 실제로는 짧고 깔끔하게 보입니다. 나는 그 중 하나를 알아내는 데 어려움을 겪습니다 :-) –
그게 미안 해요 - 두 번의 작은 실수를했습니다 –