我知道承诺是我的问题的答案,但在我的案例中需要帮助如何使用。
我的代码是:
...
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方法中使用它。请指教。
答案 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".