javascript return语句返回undefined

时间:2017-05-23 16:46:53

标签: javascript protractor salesforce soql

我正在使用量角器测试角度js salesforce应用程序。我需要使用SOQL和jsforce查询id但是当我从另一个类调用查询方法时,返回结果是未定义的。当我打印出方法中的日志时,它确实显示我正在寻找的id似乎在return语句中丢失了。

var jsforce = require('jsforce');

function querySF() {
  var conn = new jsforce.Connection({
    // you can change loginUrl to connect to sandbox or prerelease env.
    loginUrl: 'https://www.salesforce.com'
  });
  conn.login('some username', 'some password', function(err, userInfo) {
    if (err) {
      return console.error(err);
    }
    // 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);
    // ...
  }).then(function() {
    conn.query("SELECT Id FROM anObject__c Where name = 'the name'", function(err, result) {
      if (err) {
        return console.error(err);
      }
      var records = [];
      console.log("total : " + result.totalSize);
      console.log("fetched : " + result.records.length);
      // is returning the id
      console.log(result.records[0].Id);
      // the class that calls the methods saves it to a variable, the variable is undefined
      return result.records[0].Id;
    });
  });


}
在更新我的代码以匹配Thomas的答案后,以下是我收到的错误

  

失败:Helper.querySF不是函数TypeError:Helper.querySF是   不是一个功能       在Object.it(C:\ LimService \ LSApp \ tests \ specs \ bookingEvents \ EditBookingEventTest.js:23:12)       在C:\ Users \ nphillips \ AppData \ Roaming \ npm \ node_modules \ protractor \ node_modules \ jasminewd2 \ index.js:112:25       在新的ManagedPromise(C:\ Users \ nphillips \ AppData \ Roaming \ npm \ node_modules \ protractor \ node_modules \ selenium-webdriver \ lib \ promise.js:1067:7)       在ControlFlow.promise(C:\ Users \ nphillips \ AppData \ Roaming \ npm \ node_modules \ protractor \ node_modules \ selenium-webdriver \ lib \ promise.js:2396:12)       at schedulerExecute(C:\ Users \ nphillips \ AppData \ Roaming \ npm \ node_modules \ protractor \ node_modules \ jasminewd2 \ index.js:95:18)       在TaskQueue.execute_(C:\ Users \ nphillips \ AppData \ Roaming \ npm \ node_modules \ protractor \ node_modules \ selenium-webdriver \ lib \ promise.js:2970:14)       在TaskQueue.executeNext_(C:\ Users \ nphillips \ AppData \ Roaming \ npm \ node_modules \ protractor \ node_modules \ selenium-webdriver \ lib \ promise.js:2953:27)       在asyncRun(C:\ Users \ nphillips \ AppData \ Roaming \ npm \ node_modules \ protractor \ node_modules \ selenium-webdriver \ lib \ promise.js:2860:25)       在C:\ Users \ nphillips \ AppData \ Roaming \ npm \ node_modules \ protractor \ node_modules \ selenium-webdriver \ lib \ promise.js:676:7

1 个答案:

答案 0 :(得分:2)

如评论中所述,您忘记了一些return语句。

除此之外,不要混合承诺和回调。特别是不要同时使用两者来处理相同的结果。

var jsforce = require('jsforce');

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('some username', 'some 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 anObject__c Where name = 'the 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);
              // the class that calls the methods saves it to a variable, the variable is undefined
              return result.records[0].Id;
        })
        .catch(function(err){
            console.error(err);
        });
}
  

这似乎有效,但它会返回一个承诺。

这是异步代码的重点,当函数返回时,你想要的结果不是(尚);所以你必须处理将来某个时候可用的价值。

这样做的一种方法是返回Promise。

也许您应该阅读:How do I return the response from an asynchronous call?

  

看起来好像返回了3个promises,或者至少有3个值,第3个值是我需要的值。

不,这只是一个Promise链。只返回一个值,而Promise也只能解析为单个值; 虽然该单个值可能是数组

你应该习惯Promise。它们比回调语法更容易。

  

我不确定如何访问该值。

像这样:

querySF().then(function(id){
    console.log("result: ", id);
});