在使用setTimeout实现诺言并并行运行诺言时遇到问题

时间:2018-06-25 02:49:24

标签: javascript promise

我正在尝试编写一个将返回异步诺言的函数。使用100ms的setTimeout模拟承诺解析,除G(承诺之一)外,其setTimeout为200ms。每个步骤都是单独的异步承诺。

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

此处:     (b + c + d)-表示应并行执行3个承诺     '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);
});

1 个答案:

答案 0 :(得分:0)

如果您要一个接一个的承诺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');
    });