0

次の機能があるとします。

var f1 = function() {
    console.log('running f1');
    return new Promise(function(res, rej) {
        setTimeout(() => res('resolved_1!'), 1000);
    });
};

var f2 = function(a) {
    console.log('running f2 with ' + a);
    return new Promise(function(res, rej) {
        setTimeout(() => res('resolved_2!'), 2000);
    });
};

var f3 = function() {
    console.log('running f3');
    return new Promise(function(res, rej) {
        setTimeout(() => res('resolved_3!'), 3000);
    });
};

私はそれらを実行できます:

let t1 = +new Date;
Promise.all([
    f1().then(a => {
        return f2(a);
    }),
    f3()
]).then((result) => {
    let t2 = +new Date;
    console.log(t2 - t1);
});

そして、約3秒かかります。

ここで、ジェネレーターを使用してこれらの関数を実行したいと思います。

let t1 = +new Date;
let result = yield [f1(), f3()];
yield f2(result[0]);
let t2 = +new Date;
console.log(t2 - t1)

f2 を呼び出すには f1 の解決済みの値が必要なので、f1 が完了するまで待ちます。これには 5 秒かかります。同じ 3 秒を取得するにはどうすればよいですか?ただし、ジェネレーターを使用していますか?

4

1 に答える 1

1

これには 5 秒かかります。

非同期ジェネレーターでのプロミスの非並列待機によるスローダウンを参照してください。

同じ 3 秒を取得するにはどうすればよいですか?ただし、ジェネレーターを使用していますか?

同じ制御フローを表現するだけです:

let t1 = +new Date;
let result = yield [f1().then(f2), f3()];
let t2 = +new Date;
console.log(t2 - t1)

then何らかの理由で回避し、代わりにジェネレーターを使用する場合は、次のようにする必要があります

let t1 = +new Date;
let result = yield [co(function*() {
    var a = yield f1();
    return yield f2(a); // yield is optional here
}), f3()];
let t2 = +new Date;
console.log(t2 - t1)
于 2016-03-08T16:44:45.817 に答える