sails.js http.get 和回调函数?
sails.js http.get and callback functions?
我是 Javascript async 和 Sails.js 的新手,我觉得我误解了一些概念。
我有一个函数正在尝试进行 HTTP GET 调用以从 URL 中获取评论作为 JSON,然后解析这些评论以得出一个 'score' 对象评价用户的评论。我的代码示例如下 -
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);
我的问题可能很明显 - 函数 return 紧接在回调完成执行之前,分数的值只是 {}。我已经尝试将 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' 关键字。
我理解错了什么?我想 return 'scored' 的值返回到主函数,感觉我应该 'await'ing 一些东西,但我不确定在哪里。
我想到我应该做的是回调中的响应 --
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
}
await
关键字仅适用于 promises,从您使用的库 (machinepack-http) 的文档来看,它们似乎不适用于 promises。
你可以尝试切换到基于 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);
我是 Javascript async 和 Sails.js 的新手,我觉得我误解了一些概念。
我有一个函数正在尝试进行 HTTP GET 调用以从 URL 中获取评论作为 JSON,然后解析这些评论以得出一个 'score' 对象评价用户的评论。我的代码示例如下 -
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);
我的问题可能很明显 - 函数 return 紧接在回调完成执行之前,分数的值只是 {}。我已经尝试将 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' 关键字。
我理解错了什么?我想 return 'scored' 的值返回到主函数,感觉我应该 'await'ing 一些东西,但我不确定在哪里。
我想到我应该做的是回调中的响应 --
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
}
await
关键字仅适用于 promises,从您使用的库 (machinepack-http) 的文档来看,它们似乎不适用于 promises。
你可以尝试切换到基于 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);