【发布时间】:2017-02-14 14:26:38
【问题描述】:
我正在学习 Bluebird 的 promises,并且我正在尝试学习不再使用任何 Deferred()。 下面的代码按预期 100% 正确运行。 但这对我来说是一个关于重构代码以正确使用 Bluebird Promise 而不是使用 Deferred 解决方案的练习。 我正在尝试学习以不同的方式(正确地)思考 Promise,但经过多次尝试,我仍然无法弄清楚如何在下面 没有 Deferreds 的帮助下解决这个特定问题。
有人有想法吗?
运行方法如下:
1) 在您的控制台中运行此程序。它将启动一个使用 8080 端口的 websocket 服务器。
2) 然后在另一个控制台窗口中再次运行它。在尝试使用端口 8080 失败 3 次后,该端口将启动并使用端口 8081。
// 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 这样的东西会起作用吗?
-
@JaromandaX - 我刚刚注意到你的评论。它似乎不起作用,但尽管它看起来非常短而整洁,但我很难弄清楚它:-)
-
抱歉,我犯了两个小错误
-
应该是jsfiddle.net/pk50ks04/2 - 包含“转译”版本的代码