2017-08-10 2 views
0

短い質問:なぜPromise.chainがJavascriptにないのですか(Promise.allに匹敵します)?私の実装はo.kですか?私の「コーデック」は間違って振る舞っJavascriptでPromise.chain([...])を実装していますか?

  1. グラフを読み取るXMLファイルから
  2. すべてのノードの作品は
  3. を終了するのを待っている全てのノード(作成方法は、約束を返す)
  4. を作成します
  5. ノード間のすべてのエッジを作成する

問題:データベースの順序でfまたはノードの作成(ステップ2)が実行時に混乱していました。

解決方法:メソッドが実行される前に、正しい順序でデータベース呼び出しをチェーンする必要がありました。

/** 
* chains a list of functions (that return promises) and executes them in the right order 
* [function() {return Promise.resolve();}, function() {return Promise.resolve();}] 
* 
* @param funcs is an array of functions returning promises 
* @returns {Promise} 
*/ 
function chain_promises(funcs) { 
    if (funcs.length < 1) { 
     return Promise.resolve(); 
    } 
    var i = 0; 
    return chain_executor(funcs, i); 
} 

/** 
* Recursive help method for chain_promises 
* 1) executes a function that returns a promise (no params allowed) 
* 2) chains itself to the success resolve of the promise 
* 
* @param funcs is an array of functions returning promises 
* @param i is the current working index 
*/ 
function chain_executor(funcs, i) { 
    var promise = funcs[i](); 
    return promise.then(function(){ 
     console.log(i); 
     if (funcs.length > i+1) { 
      return chain_executor(funcs, i+1); 
     } else { 
      return Promise.resolve(); 
     } 
    }) 
} 
+1

として空の配列になってしまいます(私が思う)とき空の配列を渡します。 – Soronbe

+0

あなたは正しいです!ここにチェックを入れるつもりです。ありがとう – Danipol

+1

[ES6 Promises - async.eachのようなものがありますか?](https://stackoverflow.com/questions/32028552/es6-promises-something-like-async-each) – jib

答えて

1

は、この関数を作成することができます減らす

const chain_promises = arrayOfFn => arrayOfFn.reduce((promise, fn) => 
    promise.then(results => 
     fn().then(result => 
      results.concat(result) 
     ) 
    ), Promise.resolve([]) 
); 

か、ワンライナー

const chain_promises = arrayOfFn => arrayOfFn.reduce((promise, fn) => promise.then(results => fn().then(result => results.concat(result))), Promise.resolve([])); 

にしている場合これらは、解決された値すべてが.then

などで利用できます。

const chain_promises = arrayOfFn => arrayOfFn.reduce((promise, fn) => 
 
    promise.then(results => 
 
     fn().then(result => 
 
      results.concat(result) 
 
     ) 
 
    ), Promise.resolve([]) 
 
); 
 

 
const wait_promise = (time, result) => new Promise(resolve => setTimeout(resolve, time, result)); 
 
var funcs = [ 
 
    () => wait_promise(300, 'p1').then(value => ({value, date: new Date()})), 
 
    () => wait_promise(400, 'p2').then(value => ({value, date: new Date()})), 
 
    () => wait_promise(100, 'p3').then(value => ({value, date: new Date()})) 
 
]; 
 
const start = new Date(); 
 
chain_promises(funcs) 
 
.then(results => 
 
    results.reduce((a, b) => { 
 
     console.log(b.value, b.date - a); 
 
     return b.date; 
 
    }, start) 
 
);

また、この関数に空の配列を渡すことは中断されません - あなたはこの休憩解決された値

0

チェックこのソリューション:アレイ#を使用して

/** 
* Recursive help method for chain_promises 
* 1) executes a function that returns a promise (no params allowed) 
* 2) chains itself to the success resolve of the promise 
* 
* @param funcs is an array of functions returning promises 
* @param i is the current working index 
*/ 



function chain_promises(funcs, i) { 
    var promise = funcs[i](); 
    promise.then(function(data){ 
     console.log('function: ' + i); 
     console.log(data); 

     if (funcs.length > i+1) { 
      chain_promises(funcs, i+1); 
     } 
    }).catch(function (error) { 
     console.log(error); 
    }); 
} 

var funcs = [ 
    function() { 
    return new Promise(function(resolve, reject) { 
     console.log('wait 3 seconds to execute ...'); 
     setTimeout(function() {resolve(Date.now()); }, 3000); 
    }); 
    }, 
    function() { 
    return new Promise(function(resolve, reject) { 
     console.log('wait 5 seconds to execute ...'); 
     setTimeout(function() {resolve(Date.now()); }, 7000); 
    }); 
    }, 
    function() { 
    return new Promise(function(resolve, reject) { 
     console.log('wait 2 seconds to execute ...'); 
     setTimeout(function() {resolve(Date.now()); }, 2000); 
    }); 
    } 

]; 

if (funcs.length > 0) chain_promises(funcs, 0); 
+0

デモon jsbin:http:// jsbin.com/ponesan/edit?js,console –

関連する問題