my.lib.processRPC
処理のためにPromiseを返す必要があります。「Deferred」は、promise を拒否/履行するためのインターフェイスです。おそらく、これらのメソッドをエクスポートしたくないでしょう。コールバックをインストールできるプライベート スコープの Deferred から Promise を返すだけです。
私は Dojo の専門家ではありません。次のコードを正確な構文に適合させる必要があるかもしれません。あなたのシナリオに近い実装-my.rpc.module.DoSecondStep( _this.user_id )
オプションオブジェクトを作成する関数のみであることを期待しています-は次のようになります。
my.lib.processRPC = function(options)
var d = new Deferred();
// ...
return d.getPromise();
// do some heavy and/or asynchronous processing and call
d.resolve(result) // somewhen in the future
};
// narrative code:
my.lib.processRPC( my.rpc.module.getFirstStep() ).then(function(result) {
if (result)
return my.lib.processRPC( my.rpc.module.getSecondStep( _this.user_id ) )
.then( function( res ) {
console.debug('All is complete Result [' + res +']');
});
else
return /* false */ result;
}).addCallback(console.log.bind(console, "everything finished"));
doStepX
しかし、関数自体が実際に処理を行うべきであることをお勧めします。そのため、Deferreds/Promises を (最終的にはprocessRPC
内部的に呼び出して) 返し、成功しなかった場合は拒否する必要があります。Deferred は、そのようなエラーを「バブル」します。
my.rpc.module.doFirstStep = function() {
var d = new Deferred();
// ...
return d.getPromise();
// do some heavy and/or asynchronous processing and call
d.resolve(result) // or
d.reject(error) // somewhen in the future
};
my.rpc.module.doSecondStep = function(id) {
// returning a Promise, as above
};
// really narrative code:
my.rpc.module.doFirstStep()
.then(my.rpc.module.doSecondStep)
.addCallbacks(function( res ) {
console.log('All is complete Result [' + res +']');
}, function (err) {
console.log('Something happened: [' + err +']');
});
doSecondStep
最初の deferred の (成功) 結果を引数として受け取ることに注意してください。それを望まない場合、または呼び出しなしで追加のパラメーターを指定する必要がある場合は、次のようなもの.bind()
またはラッパー関数を使用する必要があります。
...then(function firstCallback() {
return my.rpc.module.DoSecondStep( _this.user_id );
})...