2016-07-08 39 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