【问题标题】:Having trouble implementing promises with setTimeout and running them in parallel使用 setTimeout 实现 Promise 并并行运行它们时遇到问题
【发布时间】:2018-06-25 15:15:41
【问题描述】:

我正在尝试编写一个返回异步承诺的函数。使用 100 毫秒的 setTimeout 来模拟承诺解析,除了 G(其中一个承诺)它的 setTimeout 是 200 毫秒。每个步骤都是单独的异步承诺。

我希望每个承诺在上一步完成后开始。 所有的 Promise 都记录他们的名字和收入参数到控制台,并提供名字作为下一个 Promise 的结果。 基本流程: a -> (b + c + d) -> e -> f -> h -> i -> j `-> g -> /

这里: (b+c+d) - 意味着 3 个 promise 应该并行运行 'i' 等待 g 和 h。 前一个任务的结果应该提供给下一个任务。

var promise = new Promise(function(resolve, reject)) {
    setTimeout(resolve, 100);
});

Promise.all([promise.resolve(a), promise.resolve(b+c+d), promise.resolve(e), promise.resolve(f), promise.resolve(g)...]).then(function(values) {
    console.log(values);
});

【问题讨论】:

  • 请编辑您的问题以包含您的代码,以便我们了解您从什么开始以及所需的输出?

标签: javascript promise


【解决方案1】:

如果您希望一个接一个地对resolve 作出承诺,请使用.then() 将它们链接起来。如果你想要一些对resolve 的承诺,请使用Promise.all()

/**
 * promiseGenerator: will generate a new promise which will resolve after <time> ms
 * time: time in milliseconds
 * */
function promiseGenerator(time){
    return new Promise((resolve, reject)=>{
        setTimeout(()=>resolve("resolved after " + time),time)
    });
}

time=100;
a = promiseGenerator(time);

    a.then((value) => {
        console.log('a resolved');
        b = promiseGenerator(time);
        c = promiseGenerator(time);
        d = promiseGenerator(time);
        return Promise.all([b, c, d])//this promise will be resolved after each of b,d,d are resolved, in any order
    })
    .then((value) => {
        console.log('b,c,d resolved');
        e = promiseGenerator(time);
        return e
    })
    .then((value) => {
        console.log('e resolved');
        f = promiseGenerator(time);
        return f
    })
    .then((value) => {
        console.log('f resolved');
        g = promiseGenerator(time*2);
        return g
    })
    .then((value) => {
        console.log('g resolved');
    });

【讨论】:

    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多