2015-04-13 3 views
0

Я пытался выполнить ряд тестов для API, для этого примера мне нужно было обновить данные моей учетной записи. Когда я запускаю тест, вызов retrieveAccount иногда запускается до того, как мой putRequest сделает тесты неудачными. Что я делаю не так?Javascript обещание не выполняется в желаемом порядке

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); 
+2

Uh, ни один из ваших функций возвращает никаких значений? Они асинхронны, 'var value = putRequest();' не могут работать! – Bergi

+0

@Bergi Я знаю, что они асинхронны, я ищу их выполнить в определенном порядке. Что бы вы предложили в качестве решения? –

+2

Вам нужно дать им обратные вызовы, чтобы вы могли правильно выполнить свои обещания, передав им «разрешение». – Bergi

ответ

0

Я рекомендую использовать последовательно вместо обещаний выполнять синхронные вызовы REST.

Судо НПМ установки sequenty

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]);

+1

Спасибо за это, я посмотрю –