Promiseの面接問題2は非同期のシリアル実行を実現します.

2155 ワード

要求によって:mergPromise関数を実現して、伝わった関数の配列を順次に実行して、しかも帰ってくるデータを順番に配列dataの中に置きます.
コードは以下の通りです.const timeout=ms=>new Promise=>
setTimeout(() => {
    resolve();
}, ms);

const ajax 1=>timeout(2000).then()=>{
console.log('1');
return 1;

const ajax 2=>timeout(1000).then(()=>{
console.log('2');
return 2;

const ajax 3=>timeout(2000).then()=>{
console.log('3');
return 3;

const mergPromise=ajaxAray=>
//          

mergo Promise([ajax 1,ajax 2,ajax 3]).then(data=>{
console.log('done');
console.log(data); // data   [1, 2, 3]

//要求はそれぞれ出力/1/2/3/done/[1,2,3]
分析:
timeoutは関数であり、この関数が実行された後にpromiseの例を返します.
ajax 1、ajax 2、ajax 3はいずれも関数ですが、これらの関数にはいくつかの特徴があり、実行後には新しいプロモーションのインスタンスが返されます.
この三つの関数を順番に実行すればいいです.結果をdataに入れますが、これらの関数は非同期です.順番に実行したいです.そして1、2、3を出力するのはそんなに簡単ではありません.例を見てください.
function A(){setTimeout(function){
  console.log('a');

function B(){setTimeout(function){
  console.log('b');

A()B()
//b/a
例では、私たちは順番にAを実行しますが、Bを出力した結果はbです.aはこれらの非同期関数に対して、順番に一つを実行しきれず、もう一つを実行します.
この問題は主にPromiseが非同期プロセスを制御することを考察しています.これらの関数を実行した後、次のコードをどうやって実現しますか?
//保存配列の関数実行後の結果var data=[]
//Promise.resoveメソッドの呼び出し時にパラメータを持たずに、そのままresoved状態のPromiseオブジェクトに戻ります.var sequence=Promise.resove()
ajaxAray.forEach(function){
//      then               ,
//      then                   ,
//         data  ,    data   。
sequence = sequence.then(item).then(function (res) {
    data.push(res);
    return data;
});
}
//遍歴が終わったらPromiseに戻ります.つまりSequenceです.彼の[PromiseValue]の値はdataです./そしてdata(行列の中の関数を保存して実行した結果)もパラメータとして、次回呼び出されるthenメソッドに入ります.return sequence
大体の考えは次の通りです.グローバルはpromiseインスタンスsequenceを定義し、巡回巡回関数配列は、sequenceを更新するたびに実行する関数itemをsequenceのthen方法で直列に接続し、結果をdata配列に押し入れて、最終的に更新されるdataを返します.このように、後でsequenceがthenメソッドを呼び出すことを保証します.どのように後ろの関数がdataを使用する必要がありますか?関数をパラメータ付きの関数に変更するだけです.
転送、注目、クリックは美しいです.