请注意,即使是阅读较旧的帖子,对于初学者来说,本主题也不是小事。
因此,我编写了一个小的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
内进行另一个回调吗?
答案 0 :(得分:1)
https://developers.google.com/actions/smarthome/traits/fanspeed#device-states及其相关概念async / await正是用于此目的。如果您不小心的话,回调可能会变得过分嵌套,而且这种方法可以更轻松地将回调展平到一个级别。两者都是节点8(稳定)中的标准。
回调和promise是用于执行同一操作的不同模式,并且具有足够的兼容性,因此您只需将Promise
s包裹在现有回调中即可。
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
});