nodejs从异步函数返回(叹气,我再次知道)

时间:2018-09-10 01:46:16

标签: node.js

请注意,即使是阅读较旧的帖子,对于初学者来说,本主题也不是小事。

因此,我编写了一个小的Node.Js应用程序,其中主应用程序中的一个函数调用自定义模块上的另一个函数。此函数使用回调,但是我需要回调的回调。

这就是我想要做的:

// file sample.js
function foo(param, callback) {
    request.get({
        url: <url>
        headers: {<headers>}
    }, (err, response, data) => {
        array = []
        obj.forEach(function (entry) {
               // do stuff with array
            };            
        });
        callback(null, array);
    });
}
module.exports.foobar = foo;

然后在我的app.js文件中,我多次这样调用函数foo

// file app.js
function bar(err, data) {
    //do things with data
    }    
}
var param = 'some param';
foo(param, bar);

param = 'some other param';
foo(param, bar);

但是我想在data函数之外使用json(一个bar obj),例如将其分配给不同的变量。我可以在bar内进行另一个回调吗?

2 个答案:

答案 0 :(得分:1)

https://developers.google.com/actions/smarthome/traits/fanspeed#device-states及其相关概念async / await正是用于此目的。如果您不小心的话,回调可能会变得过分嵌套,而且这种方法可以更轻松地将回调展平到一个级别。两者都是节点8(稳定)中的标准。

回调和promise是用于执行同一操作的不同模式,并且具有足够的兼容性,因此您只需将Promises包裹在现有回调中即可。

const util = require('util');
const barAsync = util.promisify(bar);

// Wrap in an IIFE to get async support
(async () => {
  let data = await barAsync('some param');
  // do things using data...
  data = await barAsync('some other param');
})();

答案 1 :(得分:0)

您应该尝试Promise

function foo(param, callback) {
  return new Promise((resolve, reject) => {
    request.get({
        url: '',
        headers: {}
    }, (err, response, data) => {
        array = []
        data.forEach(function (entry) {
            // do stuff with array
        });
        resolve(array)
    });
  })
 }
 module.exports.foobar = foo;

获取解析数据

let param = 'some param';
foo(param).then(data=>{
  // get your data here
});