Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angularjs$q按顺序运行_Javascript_Angularjs_Angular Promise - Fatal编程技术网

Javascript Angularjs$q按顺序运行

Javascript Angularjs$q按顺序运行,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,对angularjs和一些承诺有异议。出于某种原因,我的服务混合了查询的答案,而当服务被修复时,我需要将$q.all()更改为异步运行所有承诺,而不是按顺序运行。 现在看起来是这样的: var promises = [p1, p2, p3]; $q.all(promises).then(function () { // All promises are done }).catch(function (exception) { // An error occured. });

对angularjs和一些承诺有异议。出于某种原因,我的服务混合了查询的答案,而当服务被修复时,我需要将$q.all()更改为异步运行所有承诺,而不是按顺序运行。

现在看起来是这样的:

var promises = [p1, p2, p3];

$q.all(promises).then(function () {
    // All promises are done
}).catch(function (exception) {
    // An error occured.
});
预期的行为应该像
p1.然后(p2).然后(p3),顺序无关紧要(因为通常异步运行)。数组长度是可变的

由于$q是受Qlib启发而来的,所以我查阅了q文档,发现它不能与$q一起工作

有人能推荐一个简单的解决方案吗

我确实尝试过这个
承诺。减少($q.when,$q(initialVal))但不了解initialVal指的是什么:(


感谢阅读,祝您度过愉快的一天。

如果您已经有承诺,那么异步方法已经启动了!您必须逐个启动它们,因此您的数组需要包含返回承诺的函数,而不是承诺对象

然后你可以这样做,这比你在问题中提供的Q的捷径更清楚:

var promiseReturningFunctions = [p1, p2, p3];
var queueEntryPoint = $q.defer();
// create a waiting queue
var queue = queueEntryPoint.promise;
// this queues up the asynchronous functions
promiseReturningFunctions.forEach(function (p) {
    queue = queue.then(p);
});
// here we start processing the queue by resolving our queueEntryPoint
queueEntryPoint.resolve();
// we can now use queue.then(...) to do something after all promises in queue were resolved
queue.then(function () {
    // All promises are done
}).catch(function (exception) {
    // An error occured.
});

需要触发这些异步请求。因此,首先对这些函数进行分组并按优先级排序。接下来,连接每个解析以触发下一个函数。我将创建自己的服务来完成此操作。是的,我的第一个想法是使用递归函数触发第一个函数,然后弹出数组并在s之后再次调用ucceed。没有太多的编码,但不是真正的js风格。我感到震惊。如果我没有答案,我会自己做一些事情,并在这里发布(添加$q原型以便于重用)
initialValue
是数组中第一个异步函数的输入,除了,我认为您不需要
$q
该死的可能重复,抱歉重复…不知道为什么我找不到它:(在哪里使用了
promiseReturningFunctions
?我的错,我更改了变量名以便更好地进行教学,但遗漏了一个,请参阅我的编辑。它看起来很好。可以使用“$q.when()添加解析的入口点),并且它需要额外的措施来提供对象方法作为“then”回调。插入初始数组的实体必须注意适当的绑定,如果异步回调函数
foo.bar
使用
this
,那么您只需将其作为
promiseReturningFunctions.push添加到数组中即可(foo.bar.bind(foo))
。我看不出反对票的真正原因。好吧,对我来说,它的效果非常好,非常感谢你的帮助;)