當然不會,它是一個異步功能。最簡單的辦法是做回調擺脫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".
你不能讓'getData()'等待結果(因爲Javascript異步操作的方式)並且你不能直接從'getData()'返回結果,因爲它是異步的並且函數返回LONG之前異步結果可用。相反,您可以返回一個承諾,然後調用者可以使用promise上的'.then()'方法來檢索結果。我已經標記了這個重複的答案向你展示瞭如何做到這一點,並且還有數百篇關於如何「促成」某些事情的其他文章,以使其返回一個承諾。 – jfriend00
你如何做到這一點?示例plz – Vik
有一篇關於如何在[你被標記爲重複的問題的接受答案](https://stackoverflow.com/a/14220323/816620)中做到這一點的LONG論文。去閱讀並研究所有這些。鏈接到你的問題標題下方。標記重複的地方在於,我們不打算再次複製關於此主題的另一個問題中所寫的全部內容。在這裏每天都會發布幾十種這樣的問題,因爲它是爲大多數剛剛接觸node.js的人開發的新方法。必須學習。 – jfriend00