0

我有一个内部维护的 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编码风格非常陌生,因此,这听起来像是一个菜鸟问题。

4

1 回答 1

1

从客户端调用的 Meteor 方法Meteor.call同步运行以防止客户端挂起,即使提供了回调也是如此。

您的foo方法不会等待内部的承诺。fnTestMicroSerConn()它毫不犹豫地运行过去的调用,最终没有更多的语句要执行,undefined结果返回。当 promise 解决并在服务器控制台上记录预期的消息时,该方法已经退出。

要获得该承诺的解决/拒绝结果,您可以将承诺从方法返回给调用者,客户端将能够响应该承诺。

Meteor.methods({   
 foo: function () {
   return myNpmPackage.fnTestMicroSerConn();
 }
});

Meteor.call("foo")
  .then( response => console.log("My response: ", response.body) )
  .catch( err => console.log("err : ",err) );

Meteor 方法很强大。方法的API 文档包含很多信息,值得精通。

于 2016-09-19T14:29:02.123 回答