在 Loopback 'Before Save' 挂钩中实现回调

Implement Callbacks in Loopback 'Before Save' hook

美好的一天!我对 Node.js 和 Loopback 还很陌生。下面让我发疯。

我想将属性值写入 "before save" 上的模型实例。我从调用 REST 调用中得到一个值:

ctx.instance.hash

然后,我需要调用 REST API,获取响应,并将值写入模型。从 API 调用获取值有效,但我从另一个函数获取值。

但我无法将值返回到原始函数的范围内,因此执行以下操作:

tx.instance.somedata = externalData;

我试过: 1. 使它成为一个全局变量,但在原来的调用函数中,该值仍然是 "undef"。 2. 对值

做一个"Return"

两者都无济于事 - 值仍然是 "undefined"

我在想变量永远不会被填充,我需要使用回调,但我不确定在这种情况下如何实现回调函数。

任何指点或帮助将不胜感激,谢谢!

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
 }

好的,根据我的研究,我需要改变我的应用程序的工作方式,因为上面似乎没有实际的解决方案。

您应该在外部函数中实现承诺,然后等待外部 API 调用和使用 resolve 回调的 return 响应。

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)
    })
 }