2016-09-26 5 views
0

私は、最初のチェーンの応答を後でチェーン(4 & 6)の場所で使用する必要があると約束したチェーンを持っていますが、これを処理するためにいくつかのグローバル変数を使用します。正しい方法ではなく、これを約束で達成するためのより良い方法がありますか?promiseの応答を後でチェーンで返す

これは、問題のいくつかの実例である...

var step1 = (ms) => { 
    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     log("This is step 1"); 
     resolve(20); 
    }, ms); 
    }) 
} 
var step2 = (ms) => { 
    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     log("This is step 2"); 
     resolve(); 
    }, ms); 
    }) 
}; 
var step3 = (ms) => { 
    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     log("This is step 3"); 
     resolve(); 
    }, ms); 
    }) 
}; 

var step4 = (ms) => { 
    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     log("Step 4, run : " + ms); 
     resolve(); 
    }, ms); 
    }) 
}; 


var globalVar = null; 

//Promise chain 
step1(500) 
    .then((res) => { 
    //Here I keep the response in global variable to use later on 
    globalVar = res; 
    log(res); 
    return step2(300); 
    }).then(() => { 
    return step3(200); 
    }).then(() =>{ 
    //Here I need to use the res from the first promise 
    var lclvar = globalVar +200 ; 
    return step4(lclvar); 
    }).catch((err) => { 
    log(err); 
}); 

私はこれを見つけましたが、これは、この場合には役立っていない(少なくとも、それを処理することができませんでした)

How do I access previous promise results in a .then() chain?

+1

質問は正確にあなたがあなたのケースのために必要なものです。あなたが答えについて理解できなかったこと、またはあなたが選択した答えの中からどのソリューションを選択して適用しようとしたのかを教えてください。試したことを示すために質問を編集してください(それはうまくいかなかった)!それ以外の場合は、複製としてクローズする必要があります。 – Bergi

+0

@Bergi - ありがとう、私は成功せずにそれを分割しようと...あなたはフィールのようにそれを使用する意味ですか? –

+0

それでも、何がうまくいかなかったのか理解できるように、その試みのコードを投稿してください。あなたがすでに分裂している(鎖を壊す)ことが*働くと考えられていることをすでに理解していれば、それを並べ替えることができます。 – Bergi

答えて

2

step2step3などの呼び出しを最初のハンドラ内にネストすると、resはすべて利用可能になります

step1(500).then((res) => { 
    log(res); 
    return step2(300) 
    .then(() => step3(200)) 
    .then(() => step4(res + 200)); 
}).catch((err) => { 
    log(err); 
}); 
+0

ありがとうございますが、入れ子の約束は悪い習慣ではありませんか? –

+1

@JennyMいいえ、それは特にあなたがそれを必要とするとき(ここのような)、まあまあです。内側の約束を「返す」ことを忘れてはなりません。そうすれば、外側の鎖が続くことができます。 – Bergi

1

実際にこの言葉を鎖にすることをやめたいのであれば。アイデアは道に沿って移動するバスパラメータです。最初の約束ではクロージャとして作成されています。

あなたはこのコードを実行することができます:あなたが見つけ

log=console.log 
var step1 = (ms) => { 
var Buss={p1:20}; 
    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     log("This is step 1"); 
     resolve(Buss); 
    }, ms); 
    }) 
} 
var step2 = (ms,bus) => { 
    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     log("This is step 2"); 
     resolve(bus); 
    }, ms); 
    }) 
}; 
var step3 = (ms,bus) => { 
    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     log("This is step 3"); 
     resolve(bus); 
    }, ms); 
    }) 
}; 

var step4 = (bus) => { 
    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     log("Step 4, run : " + bus.p1); 
     log("bus arrives:",bus); 
     resolve(bus); 
    }, bus.p1); 
    }) 
}; 




//Promise chain 
step1(500) 
    .then((res) => { 
    //Here I keep the response in global variable to use later on 
    //globalVar = res; 
    log(res); 
    return step2(300,res); 
    }).then((res) => { 
    return step3(200,res); 
    }).then((res) =>{ 
    //Here I need to use the res from the first promise 
    //var lclvar = globalVar +200 ; 
    res.p1+=200; 
    return step4(res); 
    }).catch((err) => { 
    log(err); 
}); 
関連する問題