我已经看到在Q中链接任意数量的诺言;我的问题是不同的。
如何进行可变数量的调用,每个调用均按顺序异步返回?
该方案是一组HTTP请求,其数量和类型由第一个HTTP请求的结果确定。
我想简单地做到这一点。
我也看到了这个答案,暗示着这样的事情:
var q = require('q'),
itemsToProcess = ["one", "two", "three", "four", "five"];
function getDeferredResult(prevResult) {
return (function (someResult) {
var deferred = q.defer();
// any async function (setTimeout for now will do, $.ajax() later)
setTimeout(function () {
var nextResult = (someResult || "Initial_Blank_Value ") + ".." + itemsToProcess[0];
itemsToProcess = itemsToProcess.splice(1);
console.log("tick", nextResult, "Array:", itemsToProcess);
deferred.resolve(nextResult);
}, 600);
return deferred.promise;
}(prevResult));
}
var chain = q.resolve("start");
for (var i = itemsToProcess.length; i > 0; i--) {
chain = chain.then(getDeferredResult);
}
…但是以这种方式遍历itemsToProcess似乎很尴尬。或定义一个称为“循环”的新函数来抽象递归。有什么更好的方法?
使用可以很好地解决这一问题[].reduce
。
var chain = itemsToProcess.reduce(function (previous, item) {
return previous.then(function (previousValue) {
// do what you want with previous value
// return your async operation
return Q.delay(100);
})
}, Q.resolve(/* set the first "previousValue" here */));
chain.then(function (lastResult) {
// ...
});
reduce
遍历数组,传入上一次迭代的返回值。在这种情况下,您将返回诺言,因此每次您链接一个then
。您提供了一个初始承诺(如您所做的那样q.resolve("start")
)以开始工作。
刚开始时,可能需要花一些时间来思考这里发生的事情,但是如果您花一点时间来解决它,那么在任何地方使用它都是一种简单的模式,而无需设置任何机械。
问题内容: 在promise库 Q中 ,您可以执行以下操作以顺序链接promise: 但是,以下命令不适用于 $ q : 问题答案: 只需使用$ q.when()函数: 注意:foo必须是工厂,例如
问题内容: 如果我有这样的数据: 我如何将命令连接成这样: 我在下面使用了此查询,但命令列的顺序不依其顺序号而定: 任何意见和建议将不胜感激。^ _ ^ 问题答案: 永远不要使用。阅读为什么不在Oracle中使用WM_CONCAT函数? 请参阅本主题https://stackoverflow.com/a/28758117/3989608。 它没有记录,并且依赖的任何应用程序一旦升级到后都将无法工作
我正在使用改装库,我想从OpenWeatherPi获取天气预报。 我有这个。
问题内容: 我很难按顺序执行诺言。 OnceUponATime()应该顺序输出[“ Once”,“ upon”,“ a”,“ time”],但是由于某种原因,它们会立即输出。 知道我在做什么错吗? 问题答案: 但由于某种原因,它们却立即被输出。 您已经在这里打电话给他们: 您需要推动。顺便说一句,您应该使用而不是在循环中使用推入数组。实际上,您实际上并不需要,但是可以直接遍历数组:
我对RxJava很陌生,每当我有一个情况,我需要从链上的一个可观察的返回数据传递到调用“订阅” - 我很难理解如何在没有任何补丁的情况下以“反应式”方式做到这一点...... 例如: 我想发出obs1和obs2,得到它们的结果,然后发出obs3然后obs4,然后以订阅结束链,同时可以访问obs1、obs2、obs3和obs4的结果。 调用的顺序很重要,我需要在执行obs3之前完成obs1和obs2
我正在使用RxJava链接异步操作,我想向下游传递一些变量: 这似乎是一种常见的模式,但我找不到有关它的信息。