2016-04-14 13 views
2

遅延を伴う関数の連鎖方法。私は次のことを試しました:ES6約束:引数で関数を連鎖する方法

Promise.resolve() 
.then(setKeyframe('keyframe-0')) 
.then(delay(3000)) 
.then(setKeyframe('keyframe-1')) 
.then(delay(3000)) 
.then(setKeyframe('keyframe-2')) 
; 

function delay(ms) { 
    return new Promise((resolve, reject) => { 
    setTimeout(resolve, ms); 
    }); 
} 

function setKeyframe (name) { 
    var element = document.getElementsByClassName('animation-container')[0]; 
    element.className = 'animation-container ' + name; 
} 

すべての関数はすぐに呼び出されたようです。遅延関数はチェーンを遅延させません。私は何が欠けていますか?

+4

、ない約束:

Promise.resolve().then(function() { return setFirstKeyframe('keyframe-0'); }) 

これはどこes6 arrow functions岩がある:引数を持つ関数の場合

は、無名関数を使用します自体。 – Bergi

+0

すべての操作をすぐに開始しています –

答えて

3

.then()はかないことがありますが、しかし、あなたはすべての関数を呼び出す代わりに、ハンドラとしてそれらを提供したためです直接

// Yes 
Promise.resolve().then(() => { return new Promise(); }); 

// No 
Promise.resolve().then(new Promise()); 
+0

申し訳ありません。私はあなたの答えを理解していません。あなたはdelay()関数について話していますか? 「約束を返す関数を渡す」と「約束を直接渡す」との違いは何ですか? – Sven

+0

@Sven、いいえ、両方とも。私の答えを見てください。 – Qwertiy

+0

それは... の違いです。Promise.resolve()。then(新しいPromise()); Promise.resolve()。then(()=> {新しいPromise();})を返します。 –

2

約束を渡す約束

を返すことが機能を、受け入れます。

Promise.resolve('keyframe-0') 
 
.then(setKeyframe) 
 
.then(delay(3000, 'keyframe-1')) 
 
.then(setKeyframe) 
 
.then(delay(3000, 'keyframe-2')) 
 
.then(setKeyframe) 
 
; 
 

 
function delay(ms, value) { 
 
    return function (val) { 
 
    return new Promise((resolve, reject) => { 
 
     setTimeout(resolve, ms, value !== undefined ? value : val); 
 
    }); 
 
    }; 
 
} 
 

 
function setKeyframe(name) { 
 
    var element = document.body; 
 
    element.className = 'animation-container ' + name; 
 
}
html, body { 
 
    height: 100%; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
.keyframe-0 { background: red; } 
 
.keyframe-1 { background: green; } 
 
.keyframe-2 { background: blue; }

+0

すぐに遅延を作成していないことを明確にするために、それを 'makeDelayer'などの名前に変更する方がよいでしょう。 – Bergi

5

あなたの間違いは、引数なしの関数を発見する方が簡単かもしれません:

正しい方法:

上記
Promise.resolve().then(setFirstKeyframe) 

を、機能setFirstKeyframeは引数であります.then、後で電話するという約束です。

間違った方法:(!)ここで

Promise.resolve().then(setFirstKeyframe()) 

setFirstKeyframeがすぐに呼び出され、その結果(約束を)(then機能を期待しても無視されますする)thenに渡されます。あなたはthen` `への約束を返すコールバックを渡す必要が

Promise.resolve().then(() => setFirstKeyframe('keyframe-0')) 
関連する問題