2016-12-24 10 views
1

私はかなり約束していると誤解していますが、多くの読者が私の問題を解決できませんでした。ininfiniteループが約束でコールバックエラーでキャッチ

約束を使用するために変更されたばかりの別のモジュールを呼び出す既存のコードがあります。その後、>() - ラインXのコードは、これはキャッチ(の無限ループに入る例外をスローした場合)

function(params, cb) { 
    ..... 
asyncFuncwithPromise(p1).then(res = > { 
    ... // X 
    return cb(null,'msg'); 
}).catch(err => { 
    cb(err); 
}); 

function(params, cb) { 
    ..... 
    asyncFunc(p1, (err, res) => { 
    if (!err) 
     ..... 
     cb(null,'msg'); 
    else 
     cb(err); 
    }; 
}; 

は、これを変更する:このように見えた古いバージョンを使用して。キャッチからコールバックを削除しても問題ありません。誰でも説明できますか?

+0

私は決してこれに似たコードを書かなかった。あなたの 'asyncFuncwithPromise'と' cb'と何か関係があります。あなたの関数はどのように使用され、どのように 'asyncFuncwithPromise'が定義されていますか? –

+0

CB機能が必要です。それはあなたが期待していることをしていますか?それは何を返したり、そして/あるいはしますか? –

+0

ありがとう、私はCB機能(私ではない)を掘り下げます、私はちょうど私がやっていることの基礎が間違っていないことを確認したいと思っていました。 – mnsuk

答えて

0

cb()asyncFuncWithPromise()を呼び出していない限り、ここで無限ループがどのように作成されるかわかりません。

私はプロミスのコールバックチェーンを2つの平行なトラックとして考えるのが好きです。成功(then())トラックを続行するには、returnキーワードを使用します。障害(catch())トラックを続行するには、throwというキーワードを使用します。チェーンのトラックはいつでも切り替えることができますが、コールバックは直線的にしか実行されません。つまり、チェーンの前に定義されたコールバックは、あとで定義されたコールバックの後では実行できません。チェーンは常に前方に押し出され、サイクルに入ることはできません。この例では

Promise.resolve() 
    .then(()=>{ // 1S 
    if (Math.floor(Math.random() * 2)) 
     return "success"; // continue down "success" (then) track 
    else 
     throw "fail"; // continue down "failure" (catch) track 
    }) 
    .then(r=>{ // 2S 
    return "all good: " + r; 
    }) 
    .catch(e=>{ // 2F 
    // use 'return' to recover, continue down "success" track 
    return "recovered from error: " + e; 
    }) 
    .then(r=>{ // 3S 
    console.log(r); // always executed 
    }) 
    .catch(e=> { //3F 
    console.error(e); // never executed 
    }); 

catch()リンク(2F)が成功トラックにチェーンを取り戻すためにreturnを使用したため、console.log()付きチェーンの最後の成功リンク(3S)が常に実行されます。もちろん、リンクごとにthrowというキーワードを使用すると、複数のリンクで障害追跡を続けることができます。

Promiseコンストラクタを使用して新しいPromiseを作成する場合、成功と失敗のトラックは、最初にリゾルバで提供されるresolverejectの関数に対応します。

function getPromise(...) { 
    return new Promise((resolve, reject)=>{ 
    /* do something... */ 
    if (condition) { 
     resolve(result); 
    } else { 
     reject(error); 
    } 
    }); 
} 

と、この::だから、この間に有意差(機能)がない

function getPromise(...) { 
    return Promise.resolve().then(()=>{ 
    /* do something... */ 
    if (condition) 
     return result; 
    else 
     throw error; 
    }); 
} 

は、これらの違いは微妙約束チェーン内のリンクは、イベント・フレーム・タイム・実行するために延期する方法に関するものです。これは実装によって異なる場合がありますが、通常then()またはcatch()コールバックは実行中のフレームの次の後続に遅延されます。

+0

約束のいくつかの側面についての良いチュートリアルですが、私はOPの質問にどのように答えているのか不明です。 – jfriend00

+0

@ jfriend00 heh、yea、私はそれが多分質問を助けないと思います。しかし、彼が提示したことから、何が起こっているのかを知る方法はありません。循環ループに入る唯一の方法は、 'cb()'が 'asyncFuncWithPromise()'を呼び出す場合です。私は "aha"の瞬間を引き起こすと期待してPromiseのメカニックを明確にしようとしていました。 – DRAB

+0

私はあなたが助けようとしているのを見ることができると思いますが、私たちは実際にOPに質問を明確にしたいので、何が助けになるかを推測するのではなく、すべてに明らかです。 – jfriend00

関連する問題