簡體   English   中英

sails.js http.get和回調函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM