【发布时间】:2017-04-11 11:53:42
【问题描述】:
我是异步编程的新手
function loadPlugin(plugins, callback) {
let tests = [[], [], []];
plugins.forEach((plugin) => {
f.isPlugin(plugin, (exists) => {
if (exists) {
if (!f.pluginIsLoaded(plugin)) {
tests[0].push(plugin);
f.loadPlugin(plugin);
} else {
tests[1].push(plugin);
}
} else {
tests[2].push(plugin);
}
});
console.log(tests);
});
return tests;
}
和
module.exports.isPlugin = (plugin , callback) => {
fs.access(`./plugins/${plugin}`, fs.constants.F_OK, (err) => {
callback(!err);
});
};
在f.isPlugin(plugin, (exists) => { }); 内部,我将plugin 推入tests 数组,然后我从外部函数console.log(tests) 显示tests 数组是一个包含3 个空数组的数组。
有没有办法可以保留推入 f.isPlugin(plugin, (exists) => { }); 的内容,以便我可以从外部函数访问它?
【问题讨论】:
-
使用回调(来自外部函数)来检查该数组,因为回调应该是异步函数中的最后一个操作。异步函数不只是返回,它们回调。
-
不,你不能。异步结果必须在异步回调中使用,或者您可以从内部范围内调用其他函数并将数据传递给它。您不能在外部范围内同步使用它。您可以在外部范围中使用回调,该回调将从内部范围调用。而且,您还必须等待所有异步操作完成。
-
你需要确保对数组的操作确实运行完成,并不是你推入数组的东西丢失了,只是还没有发生。
-
我打电话给
f.isPlugin,它在plugins.forEach内。我希望它让它循环并在返回之前填充tests,我不知道如何处理它。 -
在许多回调函数中循环应该适合 async.waterfall 也许? "依次运行一系列函数,每个函数将其结果传递给数组中的下一个"
标签: javascript node.js asynchronous ecmascript-6