簡體   English   中英

Javascript承諾未按期望的順序執行

[英]Javascript promise not executing in desired order

我一直在嘗試對API執行許多測試,對於本示例,它需要更新我的帳戶詳細信息。 當我運行測試時,有時會在我的putRequest使測試失敗之前運行retrieveAccount調用。 我究竟做錯了什么?

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

我建議使用順序而不是承諾來執行同步REST調用。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM