2017-08-08 82 views
0

我有這樣的代碼:

function first() { 
    let promises = two(arg); 
    $q.all(promises).then(() => { 
     console.log("all promises"); 
    }); 
} 

function two(arg) { 
    let promises = []; 
    arg.forEach((ar) => { 
     let promise = funcThatReturnPromise(ar).then(() => { 
      console.log("single promise"); 
     }); 
     promises.push(promise); 
    }); 
    return promises; 
} 

我想,所有的"single promise"的將"all promises"但實際上之前打印"all promises""single promise"之前打印。

我該如何強制將所有"single promise"打印在"all promises"之前?

我試圖找到一個解決方案,但我找不到原因。

在此先感謝和抱歉我的英語!

回答

1

我剛剛測試了您的代碼,似乎無法複製您的問題。每個"single promise"將在最終的"all promises"之前打印出來,應該是預期的行爲。 如果其中一個承諾被拒絕,$ q.all的then分支將不會運行。 我的測試代碼是:

const fakePromise =() => { 
    var deferred = this.$q.defer(); 
    this.$timeout(() => { 
     deferred.resolve(); 
    }, Math.random() * 100); 
    return deferred.promise; 
} 

const two = (arg) => { 
    let promises = []; 
    arg.forEach((ar) => { 
     let promise = fakePromise().then(() => { 
      console.log("single promise"); 
     }); 
     promises.push(promise); 
    }); 
    return promises; 
} 
const first =() => { 
    let promises = two(Array(2000).fill('x')); 
    this.$q.all(promises).then(() => { 
     console.log("all promises"); 
    }); 
}; 

first(); 

也許如果你有一些其他的例子,我可以幫助更多。