[英]sails.js http.get and callback functions?
我是Javascript async和Sails.js的新手,感覺好像我誤解了一些概念。
我有一個函數正在嘗試進行HTTP GET調用,以從URL中以JSON格式獲取評論,然后解析這些評論以提供一個“得分”對象來對用戶評論進行評分。 我的代碼示例如下-
fn: async function (inputs, exits) {
let commentsUrl = 'http://foobar.com';
// we want to return a score of the users comments
let score = {};
// callback function that calls a helper to score comments
let processComments = async function (error, result) {
let scored = await sails.helpers.scoreComments(result);
return scored;
}
let HTTP = require('machinepack-http');
// go get JSON data of user comments
HTTP.get({
url: commentsUrl,
data: {},
headers: {}
}).exec((err, result) => score = processComments(err, result)
);
// this should be awaiting for the processComments callback to finish?
return exits.success(score);
我的問題可能很明顯-函數在回調完成執行之前立即返回,並且score的值僅為{}。 我曾嘗試將HTTP.get調用更改為-
// go get JSON data of user comments
HTTP.get({
url: commentsUrl,
data: {},
headers: {}
}).exec((err, result) => score = await processComments(err, result)
);
但這會導致編譯錯誤,表明Sails無法理解processComments回調前面的'await'關鍵字。
我誤會什么? 我想將“計分”的值返回給主函數,並認為我應該“等待”某些東西,但是我不確定在哪里。
await
關鍵字僅適用於promise,並且從您正在使用的庫的文檔中(machinepack-http)來看,它們似乎不適用於promise。
您可以嘗試切換到基於Promise的庫(例如axios),或將Machinepack的請求轉換為Promises,如下所示:
function getComments() {
return new Promise((resolve, reject) => {
HTTP.get({
url: commentsUrl,
data: {},
headers: {}
}).exec((err, result) => {
if (err) {
return reject(err);
}
resolve(result);
});
});
}
然后,您可以在fn中使用此代碼:
score = processComments(await getComments());
return exits.success(score);
我想到我應該做的是回調中的響應-
fn: async function (inputs, exits) {
let commentsUrl = 'http://foobar.com';
// callback function that calls a helper to score comments
let processComments = async function (error, result) {
let scored = await sails.helpers.scoreComments(result);
return return exits.success(scored);
}
let HTTP = require('machinepack-http');
// go get JSON data of user comments
HTTP.get({
url: commentsUrl,
data: {},
headers: {}
}).exec((err, result) => score = processComments(err, result)
);
// return nothing here
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.