Вопрос:

Реализация обратных вызовов в петле «До сохранения»

javascript node.js strongloop loopback

596 просмотра

2 ответа

3 Репутация автора

Добрый день! Я довольно новичок в Node.js и Loopback. Ниже сводит меня с ума.

Я хочу записать значения атрибутов в мой экземпляр модели на «перед сохранением». Я получаю одно значение от вызова REST:

ctx.instance.hash

Затем мне нужно вызвать REST API, получить ответ и записать значение в модель. Получение значения из вызова API работает, но я получаю значение из другой функции.

Но я не могу вернуть значение обратно в область действия исходной функции, чтобы сделать следующее:

tx.instance.somedata = externalData;

Я попытался: 1. Сделать это глобальным var, но в исходной вызывающей функции значение просто остается "undef". 2. Выполнение «возврата» на значение

Оба безрезультатно - значение остается "неопределенным"

Я думал, что переменная никогда не заполняется, и мне нужно использовать обратные вызовы, но я не уверен, как реализовать функцию обратного вызова в этом случае.

Любые указатели или помощь будет принята с благодарностью, спасибо!

module.exports = function(Blockanchor) {

  Blockanchor.observe('before save', function GetHash(ctx, next) {
    if (ctx.instance) {
      //console.log('ctx.instance', ctx.instance)
      var theHash = ctx.instance.hash; //NB - This variable is required for the external API call to get the relevant data

      //Run below functions to call an external API
      //Invoke function
      ExternalFunction(theHash);
      //See comment in external function, I do not know how to get that external variable here, to do the following:
      ctx.instance.somedata = externalData;

    } 
    next();
  }); //Blockanchor.observe

}//module.exports = function(Blockanchor)

Function ExternalFunction(theHash){
  //I successfully get the data from the external API call into the var "externalData"
  var externalData = 'Foo'
  //THIS IS MY PROBLEM, how do I get this value of variable  "externalData" back into the code block above where I called the external function, as I wish to add it to a field before the save occurs
 }
Автор: Grahnite Источник Размещён: 02.03.2017 11:58

Ответы (2)


0 плюса

3 Репутация автора

Хорошо, исходя из того, что я смог исследовать, мне нужно изменить способ работы моего приложения, поскольку вышеприведенное, похоже, не имеет практического решения.

Автор: Grahnite Размещён: 06.03.2017 08:40

0 плюса

53 Репутация автора

Решение

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

module.exports = function(Blockanchor) {

  Blockanchor.observe('before save', function GetHash(ctx, next) {
    if (ctx.instance) {
      //console.log('ctx.instance', ctx.instance)
      var theHash = ctx.instance.hash; //NB - This variable is required for the external API call to get the relevant data

      //Run below functions to call an external API
      //Invoke function
      ExternalFunction(theHash).then(function(externalData){
        ctx.instance.somedata = externalData;

        next();
      })
    } else {
        next();
    }
  }); //Blockanchor.observe

}//module.exports = function(Blockanchor)

function ExternalFunction(theHash){
    return new Promise(function(resolve, reject){
        var externalData = 'Foo'
        resolve(externalData)
    })
 }
Автор: Carlos G. Rodríguez Размещён: 28.03.2017 04:31
Вопросы из категории :
32x32