[英]Javascript promise not executing in desired order
I have been trying to execute a number of tests for an API, for this example it required my account details to be updated. 我一直在尝试对API执行许多测试,对于本示例,它需要更新我的帐户详细信息。 When I run the test the retrieveAccount call is sometimes run before my putRequest making the tests fail. 当我运行测试时,有时会在我的putRequest使测试失败之前运行retrieveAccount调用。 What am I doing wrong? 我究竟做错了什么?
var frisby = require('frisby');
var url = require('endpoints.js');
var auth = require('auth.js');
var oracledb = require('oracledb');
var dbConnect = require('dbconfig.js');
var myDetails = undefined;
var putRequest = function() {
frisby.create('Put update contact details - required values')
.put(url.myAccount, {
addressLine1: 'String',
addressTown: 'String',
addressCounty: 'String'
}, {json: true})
.expectStatus(200)
.expectHeaderContains('content-type', 'application/json')
.auth(auth.username, auth.password)
.toss();
}
var retrieveAccount = function() {
oracledb.getConnection(
{
user : dbConnect.user,
password : dbConnect.password,
connectString : dbConnect.connectString
},
function(err, connection)
{
if (err) {
console.error(err.message);
return;
}
connection.execute(
"SELECT addressLine1, addressTown, addressCounty "
+ "FROM accounts "
+ "WHERE account_id = 1",
function(err, result)
{
if (err) {
console.error(err.message);
return;
}
myDetails = JSON.stringify(result.rows);
myDetails = JSON.parse(myDetails);
});
});
}
var matchValues = function() {
frisby.create('Match Database and API Values')
.get(url.myAccount)
.expectStatus(200)
.expectHeaderContains('content-type', 'application/json')
.auth(auth.username1, auth.password1)
.afterJSON(function (body) {
expect(body.addressLine1).toMatch(myDetails[0][0])
expect(body.addressCounty).toMatch(myDetails[0][1])
expect(body.addressTown).toMatch(myDetails[0][0])
})
.toss();
}
function Promise(fn) {
var state = 'pending';
var value;
var deferred = null;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if(deferred) {
handle(deferred);
}
}
function handle(handler) {
if(state === 'pending') {
deferred = handler;
return;
}
if(!handler.onResolved) {
handler.resolve(value);
return;
}
var ret = handler.onResolved(value);
handler.resolve(ret);
}
this.then = function(onResolved) {
return new Promise(function(resolve) {
handle({
onResolved: onResolved,
resolve: resolve
});
});
};
fn(resolve);
}
function sendRequest() {
return new Promise(function(resolve){
var value = putRequest();
resolve(value);
});
}
function readDatabase() {
return new Promise(function(resolve){
var value = retrieveAccount();
resolve(value);
});
}
function getAccount() {
return new Promise(function(resolve){
var value = matchValues();
resolve(value);
});
}
sendRequest()
.then(readDatabase)
.then(getAccount);
I recommend using sequenty instead of promises to execute synchronous REST calls. 我建议使用顺序而不是承诺来执行同步REST调用。
sudo npm install sequenty sudo npm安装程序
var sequenty = require('sequenty'); function f1(cb) // cb: callback by sequenty { frisby.create('Match Database and API Values') .get(url.myAccount) .expectStatus(200) .expectHeaderContains('content-type', 'application/json') .auth(auth.username1, auth.password1) .afterJSON(function (body) { expect(body.addressLine1).toMatch(myDetails[0][0]) expect(body.addressCounty).toMatch(myDetails[0][1]) expect(body.addressTown).toMatch(myDetails[0][0]) cb(); }) .toss(); } function f2(cb) { frisby.create('Put update contact details - required values') .put(url.myAccount, { addressLine1: 'String', addressTown: 'String', addressCounty: 'String' }, {json: true}) .expectStatus(200) .expectHeaderContains('content-type', 'application/json') .auth(auth.username, auth.password) .toss(); } sequenty.run([f1, f2]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.