中继Q承诺结果到另一个承诺
Relay Q promise results to another promise
我将Q与RequireJS一起使用。我经常发现自己写这样的代码:
function someFunc() {
// prepare result
var res = Q.defer();
require( ['someOtherModule'], function( mod ) {
// do some stuff with mod
mod().then( function(){
// ...
return somePromise;
})
.then( function( val ) {
// resolve the functions deferred
res.resolve( val );
}, function( err ){
// relay error
res.reject( err );
});
});
// return promise
return res.promise;
}
所以我有一个函数someFunc()
,它请求一个模块(它可以在运行时确定,要加载哪个模块),然后用该模块做一些东西可能使用承诺链本身(在示例中只是链中的一个元素,但可以更多)。
最后,我只想把内部promise链的结果传递给外部deferred/promise。
我知道我可以用这样的承诺来解决
res.resolve(
mod().then( function(){
// ...
return somePromise;
})
);
但是当链变长或包含更多代码时,这将很难读懂。
我基本上是在寻找一种方法/方式来做这样的事情:
mod().then( function(){
// ...
return somePromise;
})
.relay( res );
这相当于上面的代码,用于在承诺链中维护错误。
我已经研究了Q.nfcall()
或Q.nfapply()
,但这些只适用于回调,它必须参数error
和result
。然而,在require()
调用的情况下,参数是被请求的模块,它不符合Q想要拥有的签名…
关键是您不应该在require
回调中嵌套您的链。在最低级别承诺:
function requirePromise(dep) {
var res = Q.defer();
require([dep], function(mod) {
res.resolve(mod);
});
return res.promise;
}
然后你可以在你想要的平面链中使用它:
requirePromise('someOtherModule').then(function(mod) {
…
return somePromise;
});
将一个承诺"中继"到一个等待它的递延对象中,基本上是使用反向符号的递延反模式。注意,如果您真的需要这样一个方法,它看起来就像
Promise.prototype.relay = function(def) {
return def.resolve(this);
};
相关文章:
- 一个承诺换多个承诺-并发问题
- 如何只输出一个SQL结果
- 承诺,如果第一个失败,则返回第二个承诺结果
- 不要在顺序链式承诺中包含 q 承诺结果
- WinJS,从可能是异步的函数返回一个承诺,也可能不是异步的
- 读取一个本地文件,编码为base64,我想给用户一个将结果保存到文件的选项
- 在jQuery中,.state()如何确定一个承诺是挂起的、已解决的还是被拒绝的
- 转换嵌套'对于'循环成一个承诺,为了一个承诺?嵌套承诺
- 如何通过Bluebird承诺您自己的javascript api,该api使用另一个承诺的api
- jasmine 2.0测试angularjs的工厂方法,这是一个承诺
- 做一些 ajax 并使用 getJSON 返回一个承诺
- 在 AngularJS 中声明一个承诺,并带有命名的成功/错误回调
- 链承诺.all 与从上一个承诺返回的数组.all.
- 如何更好地停止一个承诺链并开始另一个承诺链
- 同时循环承诺,直到另一个承诺结束
- 如何使用 Parse.promise javascript 定义一个承诺数组并获取结果数组 [parse.com]
- 承诺链接:在next-then回调中使用上一个承诺的结果
- 所有的承诺取决于另一个承诺的结果
- 一个承诺的意外结果
- 中继Q承诺结果到另一个承诺