2016-08-17 3 views
1

я следующие два фрагмента:Асинхронный параллельно и обещания не будут работать

1.Это устройство я хотел бы работать:

health.checkHealth = function (req, res) { 
async.parallel({ 
    cassandra: function (callback) { 
     cassandraRepository.ping(callback); 
    }, 
    kafka: function (callback) { 
     kafkaHelper.ping(callback); 
    }, 
    vault: function (callback) { 
     vaultClient.health() 
      .then((isOk)=>{ 
       callback(null, isOk)}) 
      .catch(()=> 
       callback(null, false)); 
    } 
}, function (err, result) { 
    var response = {}; 
    if (result.cassandra) { 
     response.cassandra = "OK"; 
    } else { 
     response.cassandra = "Failed"; 
     res.status(500); 
    } 

    if (result.kafka) { 
     response.kafka = "OK"; 
    } else { 
     response.kafka = "Failed"; 
     res.status(500); 
    } 

    if (result.vault) { 
     response.vault = "OK"; 
    } else { 
     response.vault = "Failed"; 
     res.status(500); 
    } 

    res.send(response); 
}) 

}

2.это является тест проверить блок:

 describe('vault is avaliable', function() { 
     beforeEach(sinon.test(function() { 
      sinon.stub(vaultClient, "health").resolves(true); 
     })); 

     it('should return 200', sinon.test(function (done) { 
      var response = { 
       vault: "OK" 
      }; 

      var req = {}; 
      var res = {}; 
      var spySend = res.send = sinon.spy(); 
      var spyStatus = res.status = sinon.spy(); 

      health.checkHealth(req, res); 
      expect(spySend.calledOnce).to.equal(true); 
      expect(spySend.calledWith(response)); 
      expect(spyStatus.calledOnce).to.equal(false); 
     })); 

    }); 

Моя проблема заключается в том, что, когда я называю checkHealth он переходит к следующей строке (ожидать (spySe nd.calledOnce) .to.equal (true);), не дожидаясь завершения обещания vaultClient. Что мне нужно сделать, чтобы ожидания ожидались только после запуска checkHealth.

+1

Да. Не используйте 'async.js' с обещаниями. – Bergi

+0

Какую библиотеку обещаний вы используете? – Bergi

+0

@Bergi свое собственное обещание. нет способа преодолеть это с помощью обещания? – yuria

ответ

2

Вам не нужно использовать async - вы можете использовать обещания непосредственно в своем коде с Promise.all, как и другие.

Код здесь использует promisifyAll от Bluebird, но вы также можете convert the APIs to use promises.

//.props is bluebird, you can `.all` with native promises too 
Promise.props({ 
    cassandra: cassandraRepository.pingAsync(); // created by promisifyAll 
    kafka: kafkaHelper.pingAsync(), 
    vault: vaultClient.health() 
}).then(results => { 
    // access results.cassandra, results.kafka and results.vaule here 
});