ヘルパー関数なし
最初はヘルパー機能なしでこれを行うという質問を受けましたが、その後のコメントはそうではないことを示唆しています。ヘルパー関数がスコープ内にある場合は下にスキップします。
ヘルパー関数を追加しなくても、ES6 promise を使用できます。
Promise.resolve()
.then(function3)
.then(function2)
.then(function1)
.then(result => {
console.log("result is " + result);
});
それはよりきれいではありません
var result = function1(function2(function3()));
...しかし、少なくとも呼び出される関数は呼び出された順序でリストされており、promise は複数の点で非常に柔軟です。
例: Babel の REPL のライブコピー
function function1(arg) {
console.log("function1 called with " + arg);
return "result1";
}
function function2(arg) {
console.log("function2 called with " + arg);
return "result2";
}
function function3() {
console.log("function3 called");
return "result3";
}
Promise.resolve()
.then(function3)
.then(function2)
.then(function1)
.then(result => {
console.log("result is " + result);
});
出力:
関数 3 が呼び出されました
function2 が result3 で呼び出される
function1 が result2 で呼び出されました
結果はresult1
ヘルパー機能付き
あなたのコメントについて:
function pipe(){
var str = 'Promise.resolve()';
for(var i = 0; i < arguments.length; i++){
str += '.then(arguments[' + i + '])'
}
eval(str);
}
pipe(c, b, a, result => { console.log("result is " + result); });
パイプは fs ライブラリにあることを知っているので、関数名はあまり良くありません。それとは別に、これに明らかな問題はありますか?
これでヘルパー関数をスローしたい場合、 はまったく必要ありませんeval
。約束されていない関数の場合は、次のようにします。
function pipe(first, ...more) {
return more.reduce((r, f) => f(r), first());
}
と
let result = pipe(function3, function2, function1);
Babel の REPL でのライブコピー
promise 化された関数またはミックスでこれを行いたい場合は、次のようにします。
function pipe(...functions) {
return functions.reduce((p, f) => p.then(f), Promise.resolve());
}
次に、あなたが示した方法でそれを呼び出すことができます:
pipe(function3, function2, function1, result => {
// ...
});
...しかし、そうするとエラーが無視されます。最後の約束を返すのでpipe
、すべての約束の良さを利用できます
pipe(function3, function2, function1, result => {
// ...
}).catch(failure => {
// ...
});
また
pipe(function3, function2, function1)
.then(result => {
// ...
})
.catch(failure => {
// ...
});
単純な関数と promise を返す関数を組み合わせた完全な例を次に示します。 Babel の REPL のライブ コピー
function pipe(...functions) {
return functions.reduce((p, f) => p.then(f), Promise.resolve());
}
function function1(arg) {
console.log("function1 called with " + arg);
return "result1";
}
function function2(arg) {
console.log("function2 called with " + arg);
return new Promise(resolve => {
setTimeout(() => {
resolve("result2");
}, 100);
});
}
function function3() {
console.log("function3 called");
return "result3";
}
pipe(function3, function2, function1)
.then(result => {
console.log("Final result is " + result);
})
.catch(failure => {
console.log("Failed with " + failure);
});
出力:
関数 3 が呼び出されました
function2 が result3 で呼び出される
function1 が result2 で呼び出されました
最終結果はresult1