Експорт не може працювати, оскільки він знаходиться поза функцією, а foo
декларація знаходиться всередині. Але якщо ви помістите експорт всередину, коли ви використовуєте свій модуль, ви не можете бути впевнені, що експорт був визначений.
Найкращий спосіб роботи з системою ansync - це використання зворотного виклику. Вам потрібно експортувати метод призначення зворотного виклику, щоб отримати зворотний виклик, і викликати його при виконанні асинхронізації.
Приклад:
var foo, callback;
async.function(function(response) {
foo = "foobar";
if( typeof callback == 'function' ){
callback(foo);
}
});
module.exports = function(cb){
if(typeof foo != 'undefined'){
cb(foo);
} else {
callback = cb;
}
}
Ось async.function
лише заповнювач, який символізує асинхронний виклик.
В основному
var fooMod = require('./foo.js');
fooMod(function(foo){
});
Кілька способів зворотного дзвінка
Якщо ваш модуль потрібно викликати більше одного разу, вам потрібно керувати масивом зворотних викликів:
var foo, callbackList = [];
async.function(function(response) {
foo = "foobar";
for(var i = 0; i < callbackList.length; i++){
callbackList[i](foo)
}
});
module.exports = function(cb){
if(typeof foo != 'undefined'){
cb(foo);
} else {
callback.push(cb);
}
}
Ось async.function
лише заповнювач, який символізує асинхронний виклик.
В основному
var fooMod = require('./foo.js');
fooMod(function(foo){
});
Обіцянка
Ви також можете використовувати Promise, щоб вирішити це. Цей метод підтримує кілька викликів за проектом Promise:
var foo, callback;
module.exports = new Promise(function(resolve, reject){
async.function(function(response) {
foo = "foobar"
resolve(foo);
});
});
Ось async.function
лише заповнювач, який символізує асинхронний виклик.
В основному
var fooMod = require('./foo.js').then(function(foo){
});
Див. Документацію Promise