2016-07-08 103 views
0

我想執行一個函數,其中的參數從一個數組值中循環。每次執行都必須等待先前完成。 下面的示例代碼應打印:承諾的串行執行

Done: 1 
Done: 2 
Done: 3 
Done: 4 
Done: 5 

謝謝!

p。

'use strict'; 

function f1(value) { 
    return new Promise((resolve, reject) => { 
     setTimeout(function() { 
      console.log('Done: ' + value); 
      resolve(true) 
     }, Math.random() * 2000 + 1000); 
    }); 
} 

const vs = [0,1,2,3,4,5]; 

vs.reduce((start, next) => { 
    return f1(next) 
}) 
+0

我做了這個使用angularjs承諾,但是完全相同可以用本地。 https://gist.github.com/ste2425/608b74d20504d526d2c08dd8fa76f675 – ste2425

回答

2

如果你只想ES6,試試這個:

'use strict'; 

function f1(value) { 
    return new Promise((resolve, reject) => { 
     setTimeout(function() { 
      console.log('Done: ' + value); 
      resolve(true) 
     }, Math.random() * 2000 + 1000); 
    }); 
} 

const vs = [0,1,2,3,4,5]; 

let promiseChain = vs.reduce((start, next) => { 
    return start.then(() => f1(next)); 
}, Promise.resolve()); 

promiseChain.then(() => console.log('Done!')); 

如果你有興趣走出決議的值,你可以嘗試this爲好。

+1

這就是我想要做的!感謝 – goliardico

+1

或者只是'對比減少((p,v)=> p.then(()=> f1(v)),Promise.resolve())''。 – jib

+0

正確,同樣的事情。我只是選擇了多行,並重新使用問題中的變量名稱(希望)來提高可讀性。 – dvlsg