2016-04-26 15 views
2

私は約束事をwaterfallyで実行できる方法があるのだろうか?すなわち、私は、現在の約束が解決されるまで、次の約束を開始しないことを望む。Javascriptの約束を1つ後に実行する

私のテスト:

import Promise from 'bluebird' 

describe('promises waterfall',() => { 
    const result = [] 
    function doItLater(val, time = 50) => { 
    return new Promise(resolve => { 
     setTimeout(() => { 
     result.push(val) 
     resolve(val) 
     }, time) 
    }) 
    } 

    it('execute promises one after one resolved', done => { 
    result.push(1) 
    const promiseList = [doItLater('a', 100),doItLater('b', 1),doItLater('c')] 
    result.push(2) 

    Promise.each(
     promiseList, 
     (output) => { 
     result.push(output + '-outputted') 
     } 
    ) 
     .then(
     () => { 
      result.push(3) 
      console.log(result) 
      expect(result).to.eql([ 1, 2, 'a', 'b', 'c', 'a-outputted', 'b-outputted', 'c-outputted', 3 ]) 
      done() 
     } 
    ) 
    }) 
}) 

更新

申し訳ありませんが、私はそれがあまりにも混乱してきた場合。私は私のテストをパスする方法を尋ねています。現在、私のテストが失敗した - 実際の結果が間違った順序である:あなたがこの

[doItLater('a', 100),doItLater('b', 1),doItLater('c')] 

のような約束を作成すると

[ 1, 
    2, 
    'b', 
    'c', 
    'a', 
    'a-outputted', 
    'b-outputted', 
    'c-outputted', 
    3 ] 
+0

@SkinnyJ、OPは前のものが解決するまで 'Promise'をブロックするように頼んでいます。 – Rayon

答えて

2

彼らはすでに非同期で実行されています。実行順序を制御する方法はありません。

あなたは以前の約束が解決された後、我々は、いずれかで約束1を作成しているし、我々は実際にresultあるresで結果を(蓄積されている、今、この

Promise.reduce([['a', 100], ['b', 1], ['c']], function(res, args) { 
    return doItLater.apply(null, args).then(function(output) { 
     res.push(output + '-outputted'); 
     return res; 
    }); 
}, result) 
.then(function(accumulatedResult) { 
    .... 
}); 

のように、あなたのケースのためのPromise.reduceを使用することができます)。すべての約束が解決されると、accumulatedResultはすべての値を持ちます。


注:強く機能間でデータを共有しないをお勧めします。あなたがする必要がある場合は、そうするべき魅力的な理由があることを確認してください。

+0

答えに感謝します。私は質問があります - 約束はどのように引き起こされますか? '()'や '.then()'によってトリガされますか?あなたが言ったように配列 '[doItLater( 'a'、100)、doItLater( 'b'、1)、doItLater( 'c')]'にそれらを割り当てるときに約束が実行されるならば、実際の結果に「a」、「b」、「c」の2つが現れますか?例えば私は約束を2回実行したので、 '[1、b、c、a、2、b、c、a、...] 'のようなものですか? –

+1

doItLater( 'a'、100) 'を実行すると、非同期操作が開始され、約束オブジェクトが返されます。したがって、 'promiseList'を実行すると、' doItLater'によって返された約束オブジェクトを扱うだけで、非同期操作は再びトリガされません。 – thefourtheye

+0

私はOPが実際に 'reduce 'ではなく' mapSeries'を探していると思います。 – Bergi

関連する問題