2016-06-23 10 views
2

私は3つの約束を一緒にしたいが、resolverejectの機能については何も分からない。最初の場合、コードはDo Work 2Do Work 3に着くのはなぜネイティブJavascriptで約束をまとめる

Do Work 1 
Do Work 2 
Do Work 3 
ERR 1 

:ある私の出力で

function testP(num) { 
    return new Promise((resolve, reject) => { 
    console.log('Do Work', num); 
    reject(num); 
    }); 
} 

function testPromises() { 
    return new Promise((resolve, reject) => { 
     testP(1) 
     .then(testP(2)) 
     .then(testP(3)) 
     .then(resolve) 
     .catch(reject); 
    }); 
}; 

const theTest = testPromises().then(()=>{ 
    console.log("all done"); 
}).catch(err => { 
    console.log("ERR", err); 
}); 

そして、何私が見ている:私は質問をするために自分のコードを簡素化しましたすぐにrejectヒットを約束しますか?私の理解は、実行する前にthen関数が約束を約束するまでresolveまたはrejectを待つことでした。あなたは

.then(testP(2)) 

を行う際ため

+2

BTW '戻り新しいプロミス((決意、リジェクト)=> {なめらか( )。その後(smth2)。その後(解決)。キャッチ(拒否); }) 'は反パターンです。 'return smth()、then(smth2);'を使うほうがずっと良いです。 –

答えて

5

あなたは、コール即時かつ無条件testP、2を渡し、そして.thenにその戻り値を渡し、barを呼び出し、その戻り値を渡し正確な方法foo(bar())foo

このコード:

testP(1) 
    .then(testP(2)) 
    .then(testP(3)) 
    .then(resolve) 
    .catch(reject); 

は、この(いくつかのマイナーな詳細は省略)のように評価されます。

  • 値1を持つコールtestPとしてp1
  • コールtestP結果として得られた値を覚えています値2
  • p1.thenを呼び出すと、その呼び出しとremembeの結果Rその呼び出しの結果に値3
  • コールp2.thenとP2
  • コールtestPとして得られた値と値resolvep3
  • コールp3.thenとして得られた値を覚え、その結果を覚えp4
  • として値を持つ
  • コールp4.catchreject
  • コール値1
  • testPへの最初の呼び出しから reject機能

  • は、あなたが最初のものが決済されるまで、あなたはコールそれは、あなたがそれへの参照を渡すことはありませんtestPを待機させることをしたい場合は値1

testPromisesからrejectを呼び出します

.then(testP) 

あなたはそれがで焼い引数を持つようにしたい場合は、bindを使用します。

.then(testP.bind(null, 2)) 

かインライン関数:

.then(function() { 
    return testP(2); 
}) 

Promiseブラウザが必要)

function testP(num) { 
 
    return new Promise((resolve, reject) => { 
 
    console.log('Do Work', num); 
 
    reject(num); 
 
    }); 
 
} 
 

 
function testPromises() { 
 
    return new Promise((resolve, reject) => { 
 
     testP(1) 
 
     .then(testP.bind(null, 2)) 
 
     .then(testP.bind(null, 3)) 
 
     .then(resolve) 
 
     .catch(reject); 
 
    }); 
 
}; 
 

 
const theTest = testPromises().then(()=>{ 
 
    console.log("all done"); 
 
}).catch(err => { 
 
    console.log("ERR", err); 
 
});

+0

'then'に渡される非関数型はナンセンスであり、' testP(2) 'が' Promise'に評価されるので)無視されることに言及する価値があります。 – ftor