nodejs在从被调用者

时间:2017-08-12 04:42:24

标签: node.js

我知道承诺是我的问题的答案,但在我的案例中需要帮助如何使用。

我的代码是:

...

invoke: (abc) => {
    module.exports.getData();
    return;
},

getData: () => {
  request(options, function(err, res, body) {
    if (res && (res.statusCode === 200 || res.statusCode === 201)) {
      logger.info("vacation balacne response:" + body);
    }
  });
},

...

所以在我目前的情况下,invoke方法不会等待getData完成。我需要从getData中的调用返回响应数据,并在invoke方法中使用它。请指教。

2 个答案:

答案 0 :(得分:0)

不确定语法但你可以在调用方法中使getData函数同步 -

invoke: (abc) => {
        module.exports.getData(function(err,result){
        if(err) // do something
        else // do something
        return;
        });
    },
    getData:(callback) => {
    request(options, function(err, res, body) {
             if (res && (res.statusCode === 200 || res.statusCode === 201)) {
                    logger.info("vacation balacne response:" + body);
                    return callback(null,body);
                }
             else return callback(err,null);
            });

}

希望它有所帮助!

答案 1 :(得分:0)

当然不会,这是一个异步功能。最简单的解决方案是将回调从getData移动到invoke,以便调用可以将其传递给getData,然后一旦数据可用,getData就可以调用“无论你需要继续发生什么”:

var Thing = {
  ....

  invoke: (andThenDoThis) => {
    Thing.getData(andThenDoThis);
  },

  getData: (andThenDoThis) => {
    request(options, function(err, res, body) {
      if (res && (res.statusCode === 200 || res.statusCode === 201)) {
        logger.info("vacation balacne response:" + body);
      }

      // THIS IS WHERE YOUR CODE WILL NOW CONTINUE:
      if (andThenDoThis) {
        andThenDoThis(err, res, body)
      }
    });
  },
  ...
};

虽然这当然很愚蠢,因为只需用this引用来定义一个对象:

class Thing {
  constructor(options) { 
    this.options = options;
  }

  invoke() {
    this.getData((err, res, body) => {
      this.handleData(err, res, body);
    });
  }

  getData(andThenDoThis) {
    request(this.options, (err, res, body) => {
      this.handleData(err, res, body) 
    });
  }

  handleData(err, res, body) {
    // do some `err` checking
    // do some `res` checking
    // do some `body` parsing
    // do whatever else
    if (this.options.forwardData) {
      this.options.forwardData(...);
    } 
  }

  ...
} 

然后只做其中一件事:

// make a thing:
let thing = new Thing({
  ...,
  forwardData: (data) => {
    // do whatever with your data.
  },
  ...
});

// and then invoke whatever it is you actually needed to do.
thing.invoke();

// code here keeps running, but that's fine, because now you're
// using "code triggers only when, and where, it needs to".