Q.all不起作用

时间:2015-01-27 10:53:06

标签: javascript node.js protractor q

我的node.js e2e测试有问题。我想等待2个承诺来解决。但出于某些原因,当我使用Q.all时,它只是冻结我的应用程序。我正在使用kriskowal的Q 1.0.0。

这有效:

var doStuff = function() {
    var promiseA = getPromiseA();
    return promiseA;
}


var prepareTestData = function(done) {
    doSomething()
    .then(doStuff)
    .then(done);
}

但这不是:

var doStuff = function() {
    var promiseA = getPromiseA();
    var promiseB = getPromiseB();
    return [promiseA, promiseB];
}


var prepareTestData = function(done) {
    doSomething()
    .all(doStuff)
    .then(done);
}

有人可以帮我解决我错过的问题吗?

3 个答案:

答案 0 :(得分:2)

*已更新*

你的问题的简化答案是all()原型方法不带参数,所以.all(doStuff)只调用doSomething()返回的promise的.all()和doStuff结束是一个从未使用过的论据。最简单的解决方案是使用nikc.org的解决方案。

答案 1 :(得分:1)

在Q中有两种方法可以使用.all()

一种是在promises数组上使用Q.all()来创建一个promise,其结果是这些promise的所有分辨率的数组。

var doStuff = function() {
    var promiseA = getPromiseA();
    var promiseB = getPromiseB();
    return Q.all([promiseA, promiseB]);
}


var prepareTestData = function(done) {
    doSomething()
    .then(doStuff)     // use then here
    .then(done);
}

另一个(如nikc.org'答案所示)是在一个承诺上调用.all(),其结果是一系列承诺。这将产生一个新的承诺,其结果是所有承诺的决议数组:

var doStuff = function() {
    var promiseA = getPromiseA();
    var promiseB = getPromiseB();
    return [promiseA, promiseB];
}


var prepareTestData = function(done) {
    doSomething()
    .then(doStuff)
    .all()
    .then(done);
}

在这两种情况下,传递给done的结果都是一个数组,其解析值为promiseApromiseB

答案 2 :(得分:0)

Promise.all的调用应该在调用返回promises数组的doStuff之后。或者,您return Q.all(Array)来自doStuff

var prepareTestData = function(done) {
    doSomething()
    .then(doStuff) // array returned here
    .all()         // all creates a promise of promises
    .then(done);
}