输入'然后' ' $ q.all'的功能之前'然后'单一承诺

时间:2017-08-08 08:25:21

标签: javascript angularjs angular-promise

我有这段代码:

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 个答案:

答案 0 :(得分: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();

也许如果你有其他一些例子,我可以提供更多帮助。