JavaScript обещание обратного вызова - PullRequest
0 голосов
/ 03 мая 2018

Я вызываю функцию javascript, которая, в свою очередь, вызывает веб-службу; ответ этой службы используется для вызова другой функции, которая также вызывает службу. В конце обоих сервисов мы устанавливаем атрибуты сеанса. Этот код не дает ошибок, но обратный вызов вызывается до того, как служба вернула данные. Основным мотивом этого кода является установка атрибутов сеанса до возврата потока из этого кода, когда обратный вызов вызывается до того, как служба вернула значения, атрибуты сеанса не установлены и требование кода не выполняется.

'use strict';

function close(sessionAttributes, fulfillmentState, message) {
    return {
        sessionAttributes,
        dialogAction: {
            type: 'Close',
            fulfillmentState,
            message : 'For security purpose answer these questions  '
        },
    };
}

function getSecurityQuestions(intentRequest, context, post_options, callback){
    const sessionAttributes = intentRequest.sessionAttributes || {};
    var policynumber = sessionAttributes.policynumber;
    var interactionID = sessionAttributes.interactionID;
    var body = "";
    var body2;
    const http = require('https');
    const promise = new Promise((resolve, reject) => {
    const post_data = JSON.stringify({"Purpose":"SecurityQuestions", "InteractionID":interactionID, "SearchStringAcctNum":policynumber});
    //ignores SSL
       process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
        var post_request = http.request(post_options, function(res) {
            res.on('data', function(chunk)  {
                body += chunk;
                
            });
            res.on('end', function() {
                context.done(body);
                resolve(body);
            });
            res.on('error', function(e) {
                reject(Error(e.message));
                context.fail('error:' + e.message);
            });
        });
        // post the data
        post_request.write(post_data);
        post_request.end();
    });
    
    callback(    promise.then((body) => {
        body2 = JSON.parse(body);
        sessionAttributes.question1 = body2.SecurityDetails[0].Question;

        close(sessionAttributes, 'Fulfilled');
      }, (error) => {
        console.log(error.message);
      })
    );  

}



function getInteraction(intentRequest, context, callback) {

    const slots = intentRequest.currentIntent.slots;
    var policynumber = "PA"+slots.PolicyNumber;
    var questionOne = slots.questionOne;
    var questionTwo = slots.questionTwo;
    const sessionAttributes = intentRequest.sessionAttributes || {};
    console.log("policy number : "+policynumber + "question 1 : "+questionOne + "question 2 : "+questionTwo);
    sessionAttributes.policynumber = policynumber;
    var body = "";
    var body2;
        // An object of options to indicate where to post to
        var post_options = {
            host: 'example.com',
            protocol: 'https:',
            port: '3000',
            path: '/hiddenPath',
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            }
        };
    const http = require('https');
    const promise = new Promise((resolve, reject) => {
    const post_data = JSON.stringify({"Purpose":"CreateInteraction"});
    //ignores SSL
       process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
        var post_request = http.request(post_options, function(res) {
            res.on('data', function(chunk)  {
                body += chunk;
            });
            res.on('end', function() {
                context.done(body);
                resolve(body);
            });
            res.on('error', function(e) {
                console.log("rejected here");
                reject(Error(e.message));
                context.fail('error:' + e.message);
            });
        });
    
        // post the data
        post_request.write(post_data);
        post_request.end();
    });
    
callback(    promise.then((body) => {
        body2 = JSON.parse(body);
        console.log("interaction ID : "+body2.InteractionID);
        sessionAttributes.interactionID = body2.InteractionID;
        getSecurityQuestions(intentRequest, context, post_options, callback);
      }, (error) => {
        console.log('Promise rejected.');
        console.log(error.message);
      }));
}
 // --------------- Intents -----------------------

/**
 * Called when the user specifies an intent for this skill.
 */
function dispatch(intentRequest, context, callback) {
    const intentName = intentRequest.currentIntent.name;
    if (intentName === 'currIntent') {
        return getInteraction(intentRequest, context, callback);
    }
    throw new Error(`Intent with name ${intentName} not supported`);
}

// --------------- Main handler -----------------------
function loggingCallback(response, originalCallback) {
    console.log("logging callback called......");
        originalCallback(null, response);
}

exports.handler = (event, context, callback) => {
    try {

        dispatch(event, context, (response) => loggingCallback(response, callback));
    } catch (err) {
        callback(err);
    }
};

1 Ответ

0 голосов
/ 03 мая 2018

Вы должны выполнить свое обещание только после окончания запроса. Обновите образец ниже. Надеюсь, поможет. Кроме того, вы отправляли недопустимый объект в качестве тела сообщения. Это тоже исправлено.

function getValue(context, post_options, callback) {

  var body = "";
  var body2;
  const http = require('http');

  const promise = new Promise((resolve, reject) => {
    // INVALID OBJECT
    //const post_data = JSON.stringify({"something"});
    const post_data = JSON.stringify({
      something: "something"
    });


    //ignores SSL
    process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
    var post_request = http.request(post_options, function(res) {

      res.on('data', function(chunk) {
        body += chunk;
        console.log("inside " + JSON.stringify(body));
        // DONT RESOLVE HERE, REQUEST IS NOT COMPLETE
        //resolve(body);
      });

      res.on('end', function() {
        context.done(body);
        //RESOLVE HERE INSTEAD
        resolve(body);
      });

      res.on('error', function(e) {
        reject(Error(e.message));
        context.fail('error:' + e.message);
      });
    });

    // post the data
    post_request.write(post_data);
    post_request.end();
  });

  promise.then((body) => {
    console.log("response data " + JSON.stringify(body));
    body2 = JSON.parse(body);
    callback(delegate(sessionAttributes, intentRequest.currentIntent.slots));

  }, (error) => {
    console.log('Promise rejected.');
    console.log(error.message);
  });

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...