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 に関するこの回答で説明されているように、いくつかのライブラリサポートを使用できることも知っています。

このコードを設計する標準的な方法を探しています。

  • 外側のスコープに変数は必要ありません
  • サードパーティの promise ライブラリに依存しない (ES6 の promise に基づく必要があります)

それを達成する方法はありますか?それとも、コードをリファクタリングして簡単にする方がよいのでしょうか?

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 に答える