6

約束の概念で私の初心者を許してください。Node.js で Q モジュールを使用しています。必要なすべての手順を実行したら、コールバックを呼び出す関数があります。問題は、Q プロミス内からコールバック関数を呼び出したいときに発生します。

私が望む機能は、最後のステップに到達したときにコールバックを呼び出すことができ、もはやプロミスのチェーン内にいないことです。したがって、コールバックは元の操作に戻ります。ただし、私がコーディングしたように、コールバックは promise のコンテキスト内で呼び出されます。この時点で、コールバック (たとえば) がエラーをスローすると、この関数のエラー ハンドラーによってキャッチされますが、これは私が望んでいるものではありません!

var updateDataStream = function(data, input, posts, stream, callback) {

    // Pack all the items up...
    Q.ncall(data._packStream, data, posts, stream)
    // Upsert the cache into the database
    .then(function(){
        return Q.ncall(data.upsert, data);
    })
    // buffer the new input
    .then(function(res){
        return Q.ncall(data.buffer, data, input);
    })
    .then(function(final){
        callback(null, final);
    })
    .fail(function(err){
        console.log('OHNOES!!!!!!!',err);
    }).end();
}

このコンテキストでは、コールバック関数内でエラーが発生すると、「OHNOES!!!!!」が発生します。印刷する....

4

1 に答える 1

4

nodeify(オプションで) promise チェーンから抜け出し、NodeJS スタイルの継続に転送するメソッドがあります。

var updateDataStream = function(data, input, posts, stream, callback) {

    // Pack all the items up...
    return Q.ncall(data._packStream, data, posts, stream)
    // Upsert the cache into the database
    .then(function(){
        return Q.ncall(data.upsert, data);
    })
    // buffer the new input
    .then(function(res){
        return Q.ncall(data.buffer, data, input);
    })
    .nodeify(callback);

}

チェーンの最初に「return」が追加され、最後に「nodeify(callback)」が追加されていることに注意してください。

ユーザーは、あなたが Q を使用していることにそれほど賢くある必要はありません…コールバックをやめない限り、代わりに Promise が返されます。

于 2013-01-28T03:21:40.583 に答える