my.lib.processRPC
需要返回一个Promise进行处理。“Deferred”是拒绝/履行承诺的接口,您可能不想导出这些方法 - 您只从私有范围的 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 );
})...