首先,因爲有本土ES6承諾,我認爲這是不,除非你有支持舊的瀏覽器或舊版本的NodeJS使用一個庫是個好主意。
當您使用promise時,您正在使用異步代碼,因此,您可以以不同的方式進行循環。
想象一下,你有這樣的片段:
function step1 (item){
return new Promise((resolve, reject) => {
setTimeout(()=>{
resolve('step 1 for item ' + item);
}, 1000);
});
}
function step2 (item){
return new Promise((resolve, reject) => {
setTimeout(()=>{
resolve('step 2 for item ' + item);
}, 1000);
});
}
function step3 (item){
return new Promise((resolve, reject) => {
setTimeout(()=>{
resolve('step 3 for item ' + item);
}, 1000);
});
}
function processItem (item) {
return step1(item).then(result =>{
console.log(result);
return step2(item);
}).then(result =>{
console.log(result);
return step3(item);
}).then(result =>{
console.log(result);
return ('finished process of item ' + item);
}).catch(err =>{
throw (err);
});
}
其中processItem功能將被應用到項目陣列。
上面的代碼是異步的,所以,當你運行它,然後inmediatly執行下一個,所以,如果processItem功能需要3秒完成,並且要將該功能應用於10個項目,這將需要3秒鐘,因爲Promise呼叫將被嚴格執行,但無需等待完成其中的任何一個。
示例代碼:
function promiseFor(set, fn){
return new Promise((resolve, reject) => {
return arr.map(item =>()=> fn(item)).forEach(proc => {
return proc().then(res => {
resolve();
}).catch(err=>{
console.log(err);
});
});
});
}
- B.運行序列中的承諾。 順序沒有開始,直到前一個已經執行到執行任何承諾,這就像一個非異步福爾循環: 例子:
function sequence (set, fn){
return set.map(item =>()=> fn(item)).reduce((curr, next)=> {
return curr.then(()=>{
return next();
})},Promise.resolve());
}
你在學習循環,承諾還是兩者?你已經知道JS中的循環和回調了嗎? – Bergi
@Bergi,我嘗試下面的代碼 var Q = require('q'); var promise = Q.when('test'); (var idx = 1; idx <= 4; idx ++){ promise.then(function(val){ console.log(val +' - '+ idx); }); } 但是輸出是測試-5測試-5測試-5測試-5 – refactor
啊是的,這只是[臭名昭着的閉環在循環問題](http://stackoverflow.com/q/1451009/1048572) – Bergi