sails.js http.get и функции обратного вызова? - PullRequest
0 голосов
/ 01 мая 2018

Я новичок в 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);

Моя проблема, вероятно, очевидна - функция возвращается непосредственно перед завершением выполнения обратного вызова, а значение показателя равно {}. Я попытался в парусе изменить вызов HTTP.get на -

// go get JSON data of user comments
HTTP.get({
  url: commentsUrl,
  data: {},
  headers: {}
}).exec((err, result) => score = await processComments(err, result)
);

Но это приводит к скомпилированной ошибке, в которой говорится, что паруса не понимают ключевое слово 'await' перед обратным вызовом processComments.

Что я неправильно понимаю? Я хотел бы вернуть значение «scored» обратно в основную функцию и почувствовать, что должен что-то «ждать», но я не уверен, где.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Ключевое слово await работает только с обещаниями, а из документации используемой вами библиотеки (machinepack-http) не похоже, что они работают с обещаниями.

Вы можете попробовать переключиться на библиотеку 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);
0 голосов
/ 01 мая 2018

Мне пришло в голову, что я должен делать, это ответ на обратный вызов -

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
}
...