Node js承诺链接问题



我正在尝试使用节点js/jsforce库连接到Salesforce并使用promise。不幸的是,其中一个方法是在获得连接之前执行的。

我有一个方法A:makeconnection,它返回连接我有方法B:它根据方法A的连接引用从Salesforce加载数据我有方法C:它根据方法A 的连接从Salesforce获得依赖关系

我希望执行以下命令A==>B==>C

不幸的是,C似乎先运行,然后是A和B,所以连接为空,失败

大致这是代码

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();

我一直收到一个错误,上面写着UnhandledPromiseRetentionWarning:错误:连接对象上需要访问令牌和URL

原因是需要从方法A获得连接并将其发送到方法C,但这并没有发生。你能告诉我哪里可能错了吗?

此外,为什么方法C在A和B之前执行。为什么我的承诺链接不能按承诺工作

我正在Vscode中运行代码,并使用节点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系列和并行的内容。

最新更新