簡體   English   中英

Node.js promise 鏈接問題

[英]Node js promise chaining issue

我正在嘗試使用 node.js / jsforce 庫連接到 Salesforce 並使用承諾。 不幸的是,其中一種方法是在獲得連接之前執行的。

我有方法 A:makeconnection 返回連接 我有方法 B:根據方法 AI 的連接引用從 Salesforce 加載數據 有方法 C:根據方法 A 的連接從 Salesforce 獲取依賴項

我想執行以下命令 A ==> B ==> C

不幸的是 C 似乎首先運行,然后是 A 和 B,所以連接是 null 並且它失敗了

大致這是代碼

let jsforce = require("jsforce");
const sfdcSoup = require("sfdc-soup");
const fs = require("fs");
let _ = require("lodash");
let trgarr = [];
let clsarr = [];
let entityarr = [];

function makeConnection() {


  return new Promise((resolve,reject) => {
     const conn = new jsforce.Connection({
          loginUrl: "https://test.salesforce.com",
          instanceUrl: "salesforce.com",
          serverUrl: "xxx",
          version: "50.0"
        });

      
        conn.login(username, password, function (err, userInfo) {
          if (err) {
            return console.error(err);
          }
      
          // console.log(conn.accessToken);
          //console.log(conn.instanceUrl);
      
          //console.log("User ID: " + userInfo.id);
          //console.log("Org ID: " + userInfo.organizationId);
          console.log("logged in");
        });  
         resolve(conn);
   });
}

function loadClasses(conn) {

  return new Promise((resolve,reject) => {
     const querystr =
     "select apiVersion,name,body from apexClass where NamespacePrefix = null";
 
   let query = conn
     .query(querystr)
     .on("record", function (rec) {
       clsarr.push(rec);
     })
     .on("end", function () {
       console.log("number of class is " + clsarr.length);
       console.log("loaded all classes");
     });  
     resolve(conn,clsarr);
  });
}

async function getDependencies(conn) {




   return new Promise((resolve,reject) => {


     let entryPoint = {
          name: "xxx",
          type: "CustomField",
          id: yyy
        };
     
     let connection = {
          token: conn.accessToken,
          url: "abc.com",
          apiVersion: "50.0"
        };

       let usageApi =  sfdcSoup.usageApi(connection, entryPoint);

        usageApi.getUsage().then((response) => {
          console.log(response.stats);
          console.log(response.csv);

        });

   });

}
async function run() {
 makeConnection().then(conn => loadClasses(conn)).then(conn=>getDependencies(conn));
}

run();


我不斷收到一條錯誤消息,提示UnhandledPromiseRejectionWarning: Error: Access token and URL are required on the connection object

原因是連接需要從方法 A 獲取並發送到方法 C,而這並沒有發生。 你能指導我哪里可能錯了嗎?

另外,為什么方法 C 在 A 和 B 之前執行。為什么我的 promise 鏈接沒有按承諾工作

我在 Vscode 中運行代碼並使用 Node 14

您的 2 方法對第一個方法makeConnection進行了較小的更正,解析應該在console.log("logged in")之后的login

第二個loadClasses ,解析應該在“結束”事件中。 請檢查以下 2 種方法。

function makeConnection() {
  return new Promise((resolve,reject) => {
     const conn = new jsforce.Connection({
          loginUrl: "https://test.salesforce.com",
          instanceUrl: "salesforce.com",
          serverUrl: "xxx",
          version: "50.0"
        });
      
        conn.login(username, password, function (err, userInfo) {
          if (err) {
            return console.error(err);
          }
      
          // console.log(conn.accessToken);
          //console.log(conn.instanceUrl);
      
          //console.log("User ID: " + userInfo.id);
          //console.log("Org ID: " + userInfo.organizationId);
          console.log("logged in");
          resolve(conn);
        });  
         
   });
}

function loadClasses(conn) {

  return new Promise((resolve,reject) => {
     const querystr =
     "select apiVersion,name,body from apexClass where NamespacePrefix = null";
 
     let query = conn
     .query(querystr)
     .on("record", function (rec) {
       clsarr.push(rec);
     })
     .on("end", function () {
       console.log("number of class is " + clsarr.length);
       console.log("loaded all classes");
       resolve(conn,clsarr);
     });  
     
  });
}

如果方法相互依賴,則應使用 promise 系列 如果方法不依賴,則應使用 promise 並行。 閱讀有關 PROMISE 串聯和並聯的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM