我尝试使用sequences的第一个策略,根据Q
API运行一系列功能。这表明了这种模式:
var funcs = [foo, bar, baz, qux];
var result = Q(initialVal);
funcs.forEach(function (f) {
result = result.then(f);
});
return result;
阵列中的每个功能都采用什么结构?我对何时使用return def.promise;
感到很困惑。那简直就是最后一行吗?是经常还是总是紧跟def.resolve(someVar)
。这样的事情会结束吗?
function foo(f){
var def = Q.defer();
f++;
def.resolve(f);
return def.promise;
}
这样,数组中的每个后续函数都将接收新计算的f
值:在这种情况下,如果var initialVal = 1;
和每个递增f++
的四个函数,返回的结果将是4
?如何访问返回的值? console.log(result)
打印{ state: 'pending' }
。
答案 0 :(得分:2)
阵列中的每个功能都采用什么结构?
Q.js允许以多种方式创建承诺。例如:
function foo(value) {
var def = Q.defer();
def.resolve(value + 1);
return def.promise;
}
function foo(value) {
return Q(value + 1);
}
function foo(value) {
return Q.Promise(function(resolve, reject) {
resolve(value + 1);
});
}
其他Promise库类似,但不一定非常灵活。原生js Promises必须使用这些方法中的第三种来构建。
但是,在现实世界中,您很少需要创建自己的Promise。您通常会处理其他人编写的promise-returns lib方法。例如:
function foo(value) {
return lib.doSomethingAsync(value, and, other, params);
}
如何访问返回的值?
如果会员名称"结果"代码更容易理解。被替换为" promise",result.then(f)
被一个调用f()
的匿名函数重写。
function performAsyncSequence() {
var promise = Q(initialVal);
funcs.forEach(function (f) {
promise = promise.then(function(previousResult) {
return f(previousResult);
});
});
return promise;
}
这与问题中的代码完全相同,但现在应该更清楚地知道先前的结果是如何沿着承诺链传递的。
在序列中访问所有以前的承诺结果会更复杂。答案here全面讨论了这个问题。