2

考虑这段代码:

function openSocket() { /* returns a promise for a socket  */ }
function sendMessage1(socket) { /* sends 1st message, returns a promise for a response */ }
function sendMessage2(socket) { /* sends 2nd message, returns a promise for a response */ }
function cleanup(socket) { /* closes the socket */ }

function updateUI() {}
function showError(error) {}

openSocket()
    .then(sendMessage1)
    .then(sendMessage2)
    .then(cleanup)
    .then(updateUI)
    .catch(showError);

请注意,这两个sendMessage*()函数都接受套接字作为参数。但只有第一个会得到这个,因为只有第一个会从openSocket().

我可以通过在外部范围中使用一个变量来解决这个问题,即一旦解决了套接字就分配它,然后在sendMessage2().

另外,我知道我可以使用一些库支持,就像这个关于 Q 的答案中描述的那样。

我正在寻找一种设计此代码的规范方法,其中:

  • 不需要外部范围内的任何变量
  • 不会依赖 3rd 方承诺库(应该基于 ES6 承诺)

有没有办法做到这一点?或者重构我的代码以使其更容易会更好吗?

4

1 回答 1

2

您可以在不使用第三方库和外部范围混乱的情况下做到这一点。简单地说,像这样将参数传递给下一个承诺

function openSocket() {
    return new Promise(function(resolved, failed) {
        if (Socket creation successful) {
            resolved(socket);
        } else {
            failed(error message);
        }
    });
}

function sendMessage1(socket) {
    // Actually send the message 1
    return new Promise(function(resolved, failed) {
        if (Message sent successfully) {
            resolved([socket, message]);
        } else {
            failed(error message);
        }
    });
}

function sendMessage2(parameters) {
    var socket = parameters[0], message = parameters[1];
    // Actually send the message 2
    return new Promise(function(resolved) {
        if (Message sent successfully) {
            resolved(socket);
        } else {
            failed(error message);
        }
    });
}

function closeSocket(socket) {}

然后像你在问题中那样调用它们

openSocket()
    .then(sendMessage1)
    .then(sendMessage2)
    .then(closeSocket)
    .catch(function(err) {
        console.error("Failed with error", err);
    });
于 2014-09-04T07:48:42.283 回答