6

私は次のようなことをしたかった:

somePromiseFunc(value1)
.then(function(value2, callback) {
    // insert the next then() into this function:
    funcWithCallback(callback);
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();

うまくいきませんでした。私はそれを働かせることができませんでした。defer()この目的で使用するように勧められました。

彼ら自身のドキュメントには、コールバック スタイルの関数には deferred を使用する必要があると書かれています。有名なフラット化ピラミッドの例はすべてコールバックに関するものであるため、これは紛らわしいですが、この例は抽象的すぎて従うことができません。

したがって、多くの人がdefers を使用しているのを目にします。それが私が行ったことです。

somePromiseFunc(value1)
.then(function(value2) {
    var promise = q.defer();

    funcWithCallback(function(err, dronesYouAreLookingFor){
        if (!err)
            promise.resolve(dronesYouAreLookingFor);
        else
            promise.reject(new Error(err));
    });
    return promise.promise;
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();

ソースコードを調べて、これも機能することがわかるまで:

somePromiseFunc(value1)
.then(function(value2) {
    return function() {
        funcWithCallback(arguments[1]);
    };
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();

この文書化されていない単純なバージョンを使用してはいけないのはなぜですか?

これはピラミッドの平坦化のように見えますが、return function(){withCB(arguments[1])}動作しないため、文書化されてreturn function(err, cb){withCB(cb)}いません。

4

1 に答える 1

9

promise ライブラリを使用する合法的な方法ではありません。Q が準拠することを目指している promise仕様で詳述されているように.then、promise ではないコールバックから返されるものはすべて、直接渡す必要があります。

基本的に、コールバック ベースのコードは、legacypromise を使用している場合と同様に扱う必要があります。

2 つの基本的なオプションがあります。funcWithCallback を何度も使用する場合は、次のようなことができます。

var promisedFunc = Q.nfbind(funcWithCallback);

somePromiseFunc(value1)
.then(function(value2) {
    return promisedFunc();
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();

または、引数を渡す必要がある場合:

var promisedFunc = Q.nfbind(funcWithCallback);

somePromiseFunc(value1)
.then(function(value2) {
    return promisedFunc(value1, value2);
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();

一度しか使用しない場合は、

somePromiseFunc(value1)
.then(function(value2) {
    return Q.nfcall(funcWithCallback);
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();

または、引数を渡す必要がある場合:

somePromiseFunc(value1)
.then(function(value2) {
    return Q.nfcall(funcWithCallback, value1, value2);
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();
于 2013-01-23T16:35:30.100 に答える