Meteor: получить значение в Meteor.call, которое вызывает метод сервера, имеющий обещание
У меня есть пакет npm, обслуживаемый внутри myNpmPackage
который экспортирует функцию (например, fnTestMicroSerConn
) как показано ниже:
const rp = require('request-promise-native')
exports.fnTestMicroSerConn = function () {
return new Promise(function(resolve, reject) {
var options = {
method: 'GET',
uri : "http://example.net",
resolveWithFullResponse: true,
}
rp(options)
.then(function (response) {
if (response.statusCode !== 200){
console.error("http not 200 but : ",response.statusCode)
resolve(false)
} else {
console.info("connected successfully : "+response.body)
resolve(response)
}
})
.catch(function (err) {
console.error("Error in establishing connectivity : ",err)
resolve(false)
})
})
}
Затем мне нужно вызвать вышеупомянутую экспортированную функцию из метода Meteor следующим образом:
import { Meteor } from 'meteor/meteor';
import myNpmPackage from 'myNpmPackage';
Meteor.methods({
foo: function () {
myNpmPackage.fnTestMicroSerConn().then(function (response){
console.log(" My response: ",response.body);
return(response.body)
})
}
});
console.log(" My response: ",response.body);
выполняется успешно, и я вижу ожидаемое значение в журнале консоли сервера. Так что пока здесь хорошо.
Тем не менее, теперь я хочу передать значение response.body
на стороне клиента. Короче, когда я делаю ниже на клиенте:
Meteor.call("foo", function (err, response) {
console.log("calling foo");
if(!err){
console.log("response : ",response);
} else {
console.log("err : ",err);
}
})
К сожалению, в настоящее время я получаю undefined
на клиенте для console.log("response : ",response);
Примечание: я использую пакет Meteor Promise отсюда
Дайте мне знать, если понадобятся какие-либо подробности или что-то неясно. Я очень новичок в стиле кодирования Promise, поэтому это может звучать как нубский вопрос.
1 ответ
Метеоритные методы, вызываемые клиентами Meteor.call
запускать синхронно, чтобы предотвратить ожидание клиентов, даже если предоставляется обратный вызов.
Ваш foo
Метод не ждет этого обещания внутри. Проходит мимо fnTestMicroSerConn()
позвоните без колебаний и в результате не будет больше оператора для выполнения, возвращая undefined
в следствии. К тому времени, как обещание было разрешено и записано ожидаемое сообщение на консоли сервера, метод был завершен.
Чтобы получить разрешенный / отклоненный результат этого обещания, вы можете вернуть обещание из метода вызывающей стороне, и клиент сможет ответить на обещание.
Meteor.methods({
foo: function () {
return myNpmPackage.fnTestMicroSerConn();
}
});
Meteor.call("foo")
.then( response => console.log("My response: ", response.body) )
.catch( err => console.log("err : ",err) );
Метеоритные методы мощные. Документация по API методов содержит много информации и заслуживает совершенства.