从另一个类的promise链中获取值

时间:2017-05-25 13:24:46

标签: javascript angularjs node.js angular-promise

我试图获取从另一个类调用的查询ID的值,但是当我调用该函数时,它给了我一个promise链而不是我正在寻找的值。

班级中的方法'助手'在下面



function querySF() {
  var conn = new jsforce.Connection({
    // you can change loginUrl to connect to sandbox or prerelease env.
    loginUrl: 'https://www.salesforce.com'
  });

  return conn.login('someusername', 'password')
    .then(function(userInfo) {
      // Now you can get the access token and instance URL information.
      // Save them to establish connection next time.
      console.log(conn.accessToken);
      console.log(conn.instanceUrl);
      // logged in user property
      console.log("User ID: " + userInfo.id);
      console.log("Org ID: " + userInfo.organizationId);
      // ...

      return conn.query("SELECT Id FROM some place Where name = 'some name'")
    })
    .then(function(result) {
      console.log("total : " + result.totalSize);
      console.log("fetched : " + result.records.length);
      // is returning the id
      console.log(result.records[0].Id);
      return result.records[0].Id; // can see the id here when debugging
    })
    .catch(function(err) {
      console.error(err);
    });
}




我正在类的底部导出这样的模块:

exports.querySF = querySF();

另一个名为' BookingEvent'调用这样的方法:var theId = Helper.querySF;并返回一个promise,我已经打印了对console.log(Helper.querySF);控制台的承诺以查看结果:

Promise {
  _45: 0,
  _81: 1,
  _65: 'a0L46111001LyvsEAC', // This is the value I need
  _54: null,
  then: [Function],
  stream: [Function: createRequest] }

有人认为我应该可以使用

helpers.querySF().then(function(value){
  console.log(value);
}) 

并且能够获得值但是我收到此错误:

  

失败:helpers.querySF不是函数

我对承诺很陌生,我公司似乎没有人可以解决这个问题。我研究了很多不同的方法来解决承诺,但它们不起作用,我也不明白。有人可以帮我解决这个承诺,所以只要我调用这个方法就可以访问id,这将是我将发送的不同查询的多次。

1 个答案:

答案 0 :(得分:0)

如果承诺彼此无关,你可以在这里找到更好的Promise.all()而不是以这种方式链接承诺。然后解决所有这些问题。如果实际上您从第一个承诺中获得第二个查询的名称,实际上您需要将它们链接起来。 然后你错过了一个捕获,以便捕获第一个承诺的错误。

也许使用函数的重构可以帮助代码看起来更好。

return conn.login('someusername', 'password')
    .then(elaborateUserInfo)
    .catch(catchErrors)
    .then(elaborateResults)
    .catch(catchErrors);
    
function elaborateUserInfo(userInfo) {
  // Now you can get the access token and instance URL information.
      // Save them to establish connection next time.
      console.log(conn.accessToken);
      console.log(conn.instanceUrl);
      // logged in user property
      console.log("User ID: " + userInfo.id);
      console.log("Org ID: " + userInfo.organizationId);
      // ...

      return conn.query("SELECT Id FROM some place Where name = 'some name'");
}


function elaborateResults(result) {
  console.log("total : " + result.totalSize);
  console.log("fetched : " + result.records.length);
  // is returning the id
  console.log(result.records[0].Id);
  return result.records[0].Id; // can see the id here when debugging
}

function catchErrors(err) {
  console.log(err);
}

它看起来更好,不是吗?

相反,此错误Failed: helpers.querySF is not a function的唯一原因是您的对象中没有该方法。你确定你真的导出它是为了在模块外可见吗?