Обещания запроса с помощью узла действий на google v2

У меня похожая проблема, такая как Использовать асинхронные функции в DialogFlow WebHook, но это решение, изменение request-promises для request-promises-native у меня не сработало, разница в том, что я использую actions-on-google lib с ActionsSDK вместо DialogFlow one, вот мой код:

function call() {

  var options = {
      url: "https://google.es"
  };
  return request(options)
    .then((res) => {
        console.log("Success", res);
        Promise.resolve();
    })
    .catch((err) => {
        console.log("Error", err);
        Promise.resolve();
    });
}


const handleAction = (conv) => {

  call()
    .then(() => {
        console.log("Going to ASK");                                                                                                                                                                                                       
        conv.ask('Hi, how is it going?');
        return Promise.resolve();
    })
    .catch(error => {
        console.log("Ask ERROR");                                                                                                                                                                                                    
        conv.ask('Hi, how is it going?');
        return Promise.resolve();

    });
}

app.intent('actions.intent.MAIN', (conv) => {
    handleAction(conv);
}); 

Если я изменю функцию вызова для этого:

function call() {
  let prom =  new Promise((resolve,reject) =>{                                                                                                                                                                                                             
        resolve();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
  });                                                                                                                                                                                                                                                     
  return prom;
}   

Работает как часы. Не понимаю, в чем я ошибаюсь, я возвращаю обещания до намерения. Любая идея?

Спасибо!


person lezepo    schedule 21.08.2018    source источник


Ответы (1)


вы можете решить эту проблему с помощью async / await. Это будет выглядеть так. Это может тебе помочь.

(async () => {
   async function call() {
    var options = {
           url: "https://google.es"
     };
    return await new Promise((resolve, reject) => {
          request(options)
            .then((res) => {
                resolve(res);
            })
            .catch((err) => {
                console.log("Error", err);
                reject(err)
            });
        }
    }

    const handleAction = await call(); //you will get result on handle Action varaible

    })();
person narayansharma91    schedule 21.08.2018
comment
Если я изменю функцию вызова на эту: function call () {let prom = new Promise ((resolve, reject) = ›{resolve ();}); возвращение выпускного вечера; } Это работает, поэтому я думаю, что проблема в том, как обрабатывать запрос. - person lezepo; 21.08.2018
comment
Это должно работать, но может быть достаточно просто добавить несколько операторов return перед каждым обещанием, т.е. return handleAction и return call() - person Nick Felker; 21.08.2018
comment
Работает, возвращая функции (обещания), что меня смущает, так это то, что возвращение нового обещания работает, потому что внутри не было ничего асинхронного (вызов запроса). Спасибо! - person lezepo; 21.08.2018
comment
Ответ отредактирован. Пожалуйста, проверьте, может ли это вам помочь. - person narayansharma91; 22.08.2018
comment
метод запроса асинхронный. Это даст вам результат при обратном вызове. если вы хотите оценить без обратного вызова, вы можете использовать обещание. - person narayansharma91; 22.08.2018