我有点困惑,我也是承诺的新手。 我的问题是beforeEach函数以随机顺序运行(这怎么可能?)这样就不会先运行删除查询。如果我在promise(??)中放入console.log消息,订单也会改变。我在这里做错了什么。
请注意,数据库(在这种情况下为neo4j)返回200 OK,以防出现约束违规,这就是我读取结果然后拒绝的原因。
我有这个测试(使用chai-as-promised):
beforeEach(function() {
return neodb.query('MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r',{}) //clear the db first
.then(neodb.query(query,{props:[{username:'arisAlexis'}]}))
.then(neodb.query(query,{props:[{username:'marySilva'}]}))
.then(neodb.query(query,{props:[{username:'silviaBurakof'}]}));
});
it('create a username conflict',function() {
return User.create([{username:'arisAlexis'}]).should.be.rejected;
})
User.create是一个静态方法,只运行它:
return db.query(query,{props:props});
所以它返回一个在这里创建的承诺:
exports.query=function(query,params) {
return new Promise(function(resolve,reject) {
request.postAsync({
uri: dbUrl,
json: {statements: [{statement: query, parameters: params}]}
}).then(function(result) {
if (result[1].errors.length > 0) {
reject(new NeoError(result[1].errors[0].message,result[1].errors[0].code));
}
resolve(result[1].results);
});
});}
我正在使用babel-node运行mocha。 我也在请求模块上使用promisify,我拒绝了自定义错误(我是否正确使用它?在文档中他们抛出错误)。
答案 0 :(得分:1)
您正在同时执行所有查询功能,而不是等待前一个查询功能结束:
.then(neodb.query(...)) // this executes `neodb.query()` right away
// and uses its return value as the callback
// function for the `.then()`.
以下是解决这个问题的方法:
beforeEach(function() {
return neodb.query('MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r',{}).then(function() {
return neodb.query(query,{props:[{username:'arisAlexis'}]});
}).then(function() {
return neodb.query(query,{props:[{username:'marySilva'}]});
}).then(function() {
return neodb.query(query,{props:[{username:'silviaBurakof'}]});
});
});