我正在學習藍鳥承諾,我試圖學會不再使用任何延期()。 下面的代碼正確且按預期運行100%。 但是,這裏對我來說是一個練習,重構代碼以正確使用Bluebird promise,而不是使用Deferred解決方案。 我試圖學會對承諾進行不同的(正確的)思考,但經過多次嘗試後,我仍然無法弄清楚如何在下面解決這個問題,而不是在延期幫助下。使用藍鳥承諾,如何解決與延期的反模式?
有沒有人有想法?
以下是如何運行它:
1)在控制檯中運行該程序。它將啓動將使用端口8080的websocket服務器。
2)然後在另一個控制檯窗口中再次運行它。其中一個將啓動並使用端口8081後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
};
}
會像[這個小提琴](https://jsfiddle.net/pk50ks04/)的工作? –
@JaromandaX - 我剛剛注意到你的評論。它似乎沒有工作,但儘管它看起來真的很短,整齊,我會很難找出一個:-) –
對不起 - 我犯了兩個小錯誤 –