如何在可以按各种顺序调用的函数中使用 promise
How to use promises in functions that can be called in various orders?
我的目标很简单。我有一堆以各种顺序调用的异步实用程序函数。
对不是这样的:
doSomething(doNextThing(doFinalThing));
但它正变得笨拙。我的目标是拥有这样的语法:
doSomething.then(doNextThing).then(doFinalThing)
但具有更改订单的能力:
doNextThing.then(doSomething).then(doFinalThing)
我将如何实现这些功能,以便它们都具有承诺意识?
每个函数都需要返回一个承诺,该承诺在其异步任务完成时完成。 查看众多现有的承诺库之一。 一个优秀的是Q。
然后,您将按顺序调用函数,如下所示:
var promiseForFinalResult = doSomething().then(doNextThing).then(doFinalThing);
这假设每个函数只接受一个参数 - 前一个函数的结果。
使用"Q",doSomething()
的实现可能如下所示:
function doSomething() {
var D = Q.defer();
kickOffSomeAsyncTask(function(err, result) {
// this callback gets called when the async task is complete
if(err) {
D.fail(err);
return;
}
D.resolve(result);
});
return D.promise;
}
查看"Q"的文档。 Q.defer
的文档位于此处,但在直接进入延迟之前,您可能需要阅读上述一些内容。
通常,在这种情况下,您所做的是抽象化为变量或函数参数的部分:
function chainStuff(first, second, third){
return first.then(second).then(thrid)
}
然后,您可以在运行时选择绑定到每个参数的回调(第一个、第二个、第三个)
if(condition){
return chainStuff(doSomething, doNextThing, doFinalThing)
}else{
return chainStuff(doNextThing, doSomething, doFinalThing)
}
相关文章:
- 根据是否解析了 Promise 从函数返回值
- 函数在promise被解析后被调用,但Jasmine未通过测试.为什么?
- AngularJS和promise值在调用本地函数时的效果-未定义
- Promise函数在.then之后未运行函数化
- 如何在异步函数中正确使用Promise.all()和then()
- 函数参数在内部不可见,返回新的Promise(函数(resolve,reject).传递给被promise化的函数的
- 多次调用promise函数,直到另一个promise函数满足条件
- 使用promise通过外部函数从DOM中检索属性
- 在promise完成后,依次运行返回promise的函数
- 如何在将Node异步函数转换为promise时使用Q库
- ES2015 Promise链-为什么promiseized函数会立即运行
- 如果没有其他函数链接到promise,则默认行为
- 如何正确使用基于Javascript Promise的函数
- 如何将多个onError函数分配给promise(由angular's$http.post返回)
- 当数组中的某个函数没有返回promise时,我可以使用$q.all吗
- bluebird promise catch() 没有使用 Promise.CancelError 调用内部函数
- 在 promise 中获取构造函数变量
- 使用 Promise 在另一个函数中调用带有 Bluebird 承诺库的函数
- JavaScript Promise 解析并拒绝函数调用序列
- Angularjs$http删除$q promise导致TypeError:对象不是函数