как сделать асинхронный вызов, используя запрос-обещание в Google Home Action - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь вызвать API в onSync () и вернуть полезную нагрузку, чтобы получить количество устройств.Даже API возвращает мне правильные данные, которые я не могу показать устройства.Ниже приведен фрагмент кода.

app.onSync((body) => {
  // TODO: Implement SYNC response
  console.log('************** inside sync **************');
  var payload = {
    agentUserId:'123',
    devices:[]
  };
    //Calling Discove Devices API
    requestAPI('------ calling API ------') 
  .then(function(data){
    let result = JSON.parse(data);
    console.log('********** RESULT ********** '+util.inspect(result,{depth:null}));
    var count = 0;
    count = Object.keys(result.Devices).length;
    console.log('********** DEVICE COUNT ********** '+count);

    //forming payload json of devices
    for(var i in result.Devices){
        var item = result.Devices[i];
        payload.devices.push({
            "id" : item.ieee_address,
            "type" : 'action.devices.types.OUTLET',
            "traits" : ['action.devices.traits.OnOff'],
            name : {
               "defaultNames" : [item.mapped_load],
               "name" : item.mapped_load,
               "nicknames" : [item.mapped_load], 
            },
            "willReportState" : false,
            "deviceInfo" : {
                "manufacturer" : 'some manufacturer',
                "model" : 'Smart-Plug',
                "hwVersion" : '1.0',
                "swVersion" : '1.0.1',
            },
        });
    }

  }).catch(function(err){
    console.log(err);
  });

  console.log('PAYLOAD %J ',payload); <----- it is always empty
  return {
    requestId: body.requestId,
    payload: payload,
    };

});

API возвращает мне правильное значение, но полезная нагрузка всегда пуста.Пожалуйста помоги.Я новичок в node.js и не знаю, как сделать асинхронный вызов.

1 Ответ

0 голосов
/ 15 октября 2018

Вы используете асинхронный вызов для получения устройств, и вам необходимо убедиться, что вы не вернете данные до того, как ваш запрос будет завершен.Вы возвращаете обещание функции, поэтому оно будет ждать:

app.onSync((body) => {
  return requestApi('...')
    .then(data => {
      return {
        requestId: body.requestId,
        payload: payload
      }
    })
})
...