Meteor:检索 Meteor.call 中的值,它调用具有承诺的服务器方法
Meteor : Retrieve value in Meteor.call which calls a server method having promise
我有一个内部维护的 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);
注意:我正在使用来自 here
的 Meteor Promise 包
如果需要更多详细信息或有任何不清楚的地方,请告诉我。我对 Promise 编码风格非常陌生,因此,这听起来像是一个菜鸟问题。
Meteor 方法由 Meteor.call
运行 同步从客户端调用以防止客户端挂起,即使提供了回调也是如此。
您的 foo
方法不会等待内部的承诺。它 运行 毫不犹豫地过去了 fnTestMicroSerConn()
调用,最终没有更多的语句要执行,结果 returning undefined
。当 promise 解决并在服务器控制台上记录预期的消息时,该方法已经退出。
要获得该承诺的 resolved/rejected 结果,您可以 return 从方法到调用者的承诺,客户端将能够响应该承诺。
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 documentation方法信息量大,值得掌握
我有一个内部维护的 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);
注意:我正在使用来自 here
的 Meteor Promise 包如果需要更多详细信息或有任何不清楚的地方,请告诉我。我对 Promise 编码风格非常陌生,因此,这听起来像是一个菜鸟问题。
Meteor 方法由 Meteor.call
运行 同步从客户端调用以防止客户端挂起,即使提供了回调也是如此。
您的 foo
方法不会等待内部的承诺。它 运行 毫不犹豫地过去了 fnTestMicroSerConn()
调用,最终没有更多的语句要执行,结果 returning undefined
。当 promise 解决并在服务器控制台上记录预期的消息时,该方法已经退出。
要获得该承诺的 resolved/rejected 结果,您可以 return 从方法到调用者的承诺,客户端将能够响应该承诺。
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 documentation方法信息量大,值得掌握