1

いくつかの関数を抽出してPromiseチェーンをリファクタリングしたいと考えています。現在、私はPromiseチェーンでの関数の抽出

const getData = (uuid) => { 
    return new Promise((resolve) => { 
    fetch(
     // go fetch stuff 
    ) 
    .then((response) => { 
     if (!response.ok) { 
     return resolve(false); 
     } 
     return response; 
    }) 
    .then(fetchres.json) 
    .then(response => { 
     // Do more stuff that requires resolves that I will also want to refactor 
    }) 
    .catch(err => { 
     console.log(err); 
     resolve(false); 
    }); 
    }); 
}; 

を持っているので、私は失敗した応答をresolve部分を抽出したいです。しかし、成功したものに合格する。私はそれのようにそれを引っ張った。

const resolveUnsuccessfulResponses = (response) => { 
    if (!response.ok) { 
    return response.resolve(false); 
    } 
    return response; 
} 


const getData = (uuid) => { 
    return new Promise((resolve) => { 
    fetch(
     // go fetch stuff 
    ) 
    .then(resolveUnsuccessfulResponses) 
    .then(fetchres.json) 
    .then(response => { 
     // Do more stuff that requires resolves that I will also want to refactor 
    }) 
    .catch(err => { 
     console.log(err); 
     resolve(false); 
    }); 
    }); 
}; 

ここで私は間違いなくエラーresolve is not definedを受け取りました。この約束を外部機能で解決するにはどうすればよいですか? 抽出した機能にresolveを渡す必要がありますか?それはぎこちないように見えるでしょう。

.then(response => resolveUnsuccessfulResponses(response, resolve)) 

私は

.then(fetchres.json) 
.then(parseResponseData) 
.then(postDataSomewhere) 
.then(doOtherThings) 
.then(doEvenMoreCoolThings) 

のようなものを持ってしまう可能性があり、それらのそれぞれにresponseresolveを渡すために持っているあなたは、あなたの外部関数から新しい約束を返す必要があります

+0

もしあなたが 'return resolve(f alse); 'あなたは間違っていると思う[連鎖を破る](http://stackoverflow.com/q/21576862/1048572)。そして、あなたは['Promise'コンストラクタの反パターンを避けるべきです(http://stackoverflow.com/q/23803743/1048572)! – Bergi

+0

@Bergiプロミスのコンストラクタ反パターンのリンクをありがとう!また、はい、私はちょうどそれが今でも 'fetchres.json'に' false'を渡していることに気付きました。 –

答えて

1

間違っているようだaswell :

const resolveUnsuccessfulResponses = (response) => { 
    return new Promise((resolve, reject) => { 
    if (!response.ok) { 
     return resolve(false); 
    } 
    return resolve(response); 
    }); 
} 
+0

ああ、ありがとう。私はチェーンの下で応答を引き継ぎ続けたいと思っていた時に、それは同じPromiseフィルタリングでなければなりませんでした。私はそれが事実ではないと思いますか? –

+0

プロミスは1つの値にしか解決できないので、レスポンスを解決するか、レスポンスを解決するか、それを解決してください: 'resolve({... response、extraStuff})' – frankies

+0

また、これが問題を引き起こさないでしょう。私が '解決(false) 'すると、これはチェーンを次の関数に引き継ぐことになります。私はこれが起こることを望んでいない。このような場合、私は 'false'でそれを終了し、残りの部分はスキップします。 –

関連する問題