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);