2017-05-24 11 views
0

約束の誰かがきれいに失敗した場合、約束全体を拒否したいと思っています。私はこの拒否を「キャッチ」し、エラー通知を送信したいと思います。私はそれに次のコードを実装しました:その中で約束を拒否する方法

let reportMetaData = api.ajaxGet(api.buildV3EnterpriseUrl('reports' + '/' + params.report_id)) 
    .catch(error => { 
    if (error.status === constants.HTTP_STATUS.GATEWAY_TIMEOUT) { 
     this.notify.error(this.translate('reports.report_timedout'), this.translate('reports.report_timedout_desc')); 
    } else { 
     this.send('error', error); 
    } 
    }); 

let aggregateData = reportMetaData.then(success => { 
    try { 
    return api.xmlRequest('GET', success.aggregationUrls.elements[0].url); 
    } catch (error) { 
    return Promise.reject(); 
    } 
}).then(rawData => { 
    try { 
    return JSON.parse('{' + rawData + '}'); 
    } catch (error) { 
    return Promise.reject(); 
    } 
}, error => Promise.reject(error)); 

let aggregateReport = aggregateData.then(data => { 
    if (!data || !data.report) { 
    return Promise.reject(); 
    } 
    return data.report; 
}).catch(error =>{ 
    this.notify.error(this.translate('reports.report_timedout'), error); 
}); 

ご覧のとおり、わかりやすく複雑です。私はこれを単純化する方法はありますか?誰かが失敗すると失敗するという約束をすべて拒否する最も簡単な方法を望んでいます。どのように私はその機能の中からそれをするのですか?また、スローされたエラーが、クロムのコンソールに途切れることなく、誤ったエラーとして表示されるようです。私はそれを捕まえたにもかかわらず、なぜそれは泡立つのですか?

+0

私は間違っているか、あなたが既にPromise.reject()を返すことでこれをやっていませんか?私はあなたが単純にいくつかのエラーキャッチャーを残すことができると思うし、それはすべて最後のものに行くだろう... –

+1

主な問題は、実際にチェーンを持っていないように思われる。お互いに関係のないいくつかの別々の約束があります。すべてのコードを1つの約束のチェーンにまとめるつもりですか?既に複数の場所でそれを行っているので、 '.then()'の内部から拒否する方法を既に知っているので、あなたの質問は今のところ答えることができません。しかし、あなたは 'Promise.all()'のようなものと一緒にあなたの約束を集めるか、実際にそれらを1つのチェーンにしなければなりません。私たちはあなたがコードのために何をしようとしているのか分かりません。 – jfriend00

+0

私は自分の質問を修正しました。今はっきりしていることを願っています。基本的に私は自分のコードをきれいにしたい。 Btw私は約束を一緒に連鎖している。たとえば、aggregateReportはaggregateDataの場合は「then」で、aggregateDataの場合はindividualReportも「then」です。したがって、これらは連鎖しています。 –

答えて

0

Promise.all(iterable)のすべてを集計してください。

ここ

より:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

これはあなたが欲しかったかなり何でない場合は、ブルーバードを見てみましょう - フル機能の約束ライブラリを。 Here

UPDATE:あなたが関数内の約束のいずれかが失敗した場合、全体の約束を拒否したい場合は、実装してみてください:

throw validationError; 

は、それが動作願っています。

+0

OPはBluebirdを使用していると指定していませんでした。 – nem035

+0

ええ、私はそれが決定した場合に備えて送った。しかし、最初のリンクはES6関連の約束です。 – oneturkmen

+2

あなたはそれについて明白になりたいかもしれません。リンクを使って "これを使う"と言ってもあまり意味がありません:) – nem035

0

あなたは少し物事をクリーンアップする非同期機能を使用することができます。私はあなたのコードを次のものに置き換えることができると思います。

async function processDataAndReport() { 
    try { 
    const data = await api.ajaxGet(api.buildV3EnterpriseUrl('reports' + '/' + params.report_id)); 
    const rawData = await api.xmlRequest('GET', data.aggregationUrls.elements[0].url); 
    const { report } = JSON.parse(`{${rawData}}`);       
    } catch(e) { 
    // send notification 
    } 
} 
関連する問題