Ответ из сетевого запроса - PullRequest
       1

Ответ из сетевого запроса

0 голосов
/ 17 февраля 2019

У меня есть следующий код

function search(agent){
  var term = agent.parameters.searchphrase;

  ddg.query( term, function( err, data ){
    var answer = data.AbstractText;
    var imageUrl = data.Image;
    var source = data.AbstractSource;
    var moreUrl = data.AbstractURL;
    var heading = data.Heading;
    console.log( answer );
    agent.add( 'anything' );
    console.log( 'smh' );
    agent.add( answer );
    agent.add( new Card( {
        title: heading,
        imageUrl: imageUrl,
        text: answer,
        buttonText: 'More about this',
        buttonUrl: moreUrl
      } )
    );
    agent.add( 'Answer provided by DuckDuckGo and ' + source );
  } );
}

Когда я пытаюсь вызвать agent.add из-за обратного вызова, это не сработает, хотя все остальное там работает.

Когда яназовите это снаружи, это работает просто отлично.

Как я могу это исправить?

1 Ответ

0 голосов
/ 17 февраля 2019

Для обработчиков намерений, которые выполняют асинхронные операции (например, сетевой вызов, который получает обратный вызов), вы должны вернуть объект Promise, чтобы указать, что вам нужно дождаться завершения обещания, прежде чем возвращать результаты.

Неясно, может ли ваш ddg объект вернуть Обещание, но вы можете обернуть Обещание в обратный вызов чем-то вроде

function search(agent){
  var term = agent.parameters.searchphrase;

  return new Promise( function( resolve, reject ){
    ddg.query( term, function( err, data ){
      if( err ){
        reject( err );
      } else {
        // Put the previous body of your callback here, concluding with...
        resolve();
      }
    })
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...