有没有办法在延期承诺中提前返回
Is there a way to return early in deferred promise?
所以我有一个包含多个检查的承诺,比如这个
function test(){
var deferred = q.defer()
var passed = false
if(!passed){
deferred.reject("Don't proceed")
//return
} else {
if(!passed){
deferred.reject("Don't proceed")
} else {
if(!passed){
deferred.reject("Don't proceed")
} else {
setTimeout(function(){
console.log("Hello");
deferred.resolve()
}, 100);
}
}
}
return deferred.promise
}
这看起来很糟糕,因为底部有一个金字塔。我想知道在'q'中是否有类似return的东西可以让代码看起来更好?例如:
function test(){
var deferred = q.defer()
var passed = false
if(!passed){
deferred.reject("Don't proceed")
return
}
if(!passed){
deferred.reject("Don't proceed")
return
}
if(!passed){
deferred.reject("Don't proceed")
return
}
setTimeout(function(){
console.log("Hello");
deferred.resolve()
}, 100);
return deferred.promise
}
这肯定不起作用,因为它在承诺返回之前就返回了,但我想知道有没有类似的返回?
尽量不要创建一个延迟,它可能会被函数的多个部分拒绝,并且需要在每个退出点返回
相反,使用单独的promise代码,控制流的每个分支都有一个promise。您可以使用Q.reject
和Q.Promise
构造函数,避免使用不推荐使用的延迟模式。你的功能会是这样的:
function test() {
var deferred = q.defer()
var passed = false
if (!passed)
return Q.reject("Don't proceed");
if (!passed)
return Q.reject("Don't proceed");
if (!passed)
return Q.reject("Don't proceed");
// else
return new Promise(function(resolve) {
setTimeout(function(){
console.log("Hello");
resolve();
}, 100);
});
}
或者,您可以将test
函数封装在Q.fbind
中,这样就可以不编写return Q.reject(…);
,而只编写throw …;
。
function test(){
var deferred = q.defer()
var passed = false
if(true){
deferred.reject(new Error("Don't proceed1"))
return deferred.promise
}
if(!passed){
deferred.reject(new Error("Don't proceed2"))
return deferred.promise
}
if(!passed){
deferred.reject(new Error("Don't proceed3"))
return deferred.promise
}
setTimeout(function(){
console.log("Hello");
deferred.resolve()
});
return deferred.promise
}
我认为这是最好的方式,感谢Bergi
相关文章:
- 谷歌日历 api 调用可以在角度工厂内返回承诺吗?
- JavaScript - 返回承诺和/或调用回调
- 在同一函数中解析承诺后返回承诺
- 承诺返回承诺
- 承诺返回承诺
- 如何从多个承诺中返回承诺
- 如何使用在 AngularJS 中返回承诺的$resource测试工厂
- 这是一种常见的模式吗?(返回数据而不是返回承诺)
- 使用 Jasmine 2.4.* 测试返回承诺的服务
- 承诺回调返回承诺
- 可以 Angular 模板调用函数返回承诺
- 链接返回承诺数组的函数
- 使用属性从指令返回承诺
- 节点.js SQLite 3 返回承诺
- 从延迟的回调中返回承诺
- 返回承诺与返回承诺内未定义之间的区别
- 返回承诺值
- 如何在返回承诺的服务中创建 reset() 方法
- 从顺序 jQuery ajax 调用返回承诺
- 在 Redux Thunk 发货后从商店返回承诺