Ответ 1
Попробуйте использовать wrapAsync
e.g
npmPackage.getInfoSync = Meteor._wrapAsync(npmPackage.getInfo.bind(npmPackage));
var data = npmPackage.getInfoSync();
UserSession.insert({
key: 'info',
value: data
});
Вы можете добавить params в npmPackage.getInfoSync()
, если хотите (если это потребуется).
Дело в том, что обратный вызов должен быть в волокне, из которого возникает ошибка. Лучший способ сделать это - Meteor.bindEnvironment
. Meteor._wrapAsync
делает это для вас и делает код синхронным. Что еще лучше:)
Meteor._wrapAsync - это недокументированный метод, который принимает метод, последний параметр которого является обратным вызовом с первым параметром как error
, а второй - как result
. Также как ваш обратный вызов.
Затем он завершает обратный вызов в Meteor.bindEnvironment
и ждет его, а затем возвращает значение синхронно.