0

我对 Node.js 还很陌生,我想要实现的是拥有两个独立的功能。一个用于身份验证,一个用于发送数据(这样如果我在 conn.login 完成后简单地使用回调,我就不会遇到速率登录限制)。我试图在节点中这样设置:


var _request = {
    url: '/services/data/v45.0/actions/custom/flow/Test1',
    method: 'POST',
    body: JSON.stringify({
        "inputs": [{}]
    }),
    headers: {
        "Content-Type": "application/json"
    }
};

var conn = new jsforce.Connection({
    clientId: process.env.cliendId,
    clientSecret: process.env.clientSecret,
    version: "45.0"
});

function sfdcAuth() {
    conn.login(process.env.sfdcUser, process.env.sfdcUserPass, (err, userInfo) => {
        if (err) {
            console.log(err)
        }
        conn = conn;
        console.log("Done")
    });
}

function sfdcQuery() {
    conn.request(_request, function(err, resp) {
        console.log(resp);
        console.log(err)
    });
}
sfdcAuth()
sfdcQuery()

但是由于 js 是异步的,它运行第二个函数而不等待第一个函数完成。

4

1 回答 1

2

最简单的方法是将第二个函数作为回调传递给第一个函数,它可以在完成后调用:

function sfdcAuth(callback) {
  conn.login(process.env.sfdcUser, process.env.sfdcUserPass, (err, userInfo) => {
    if (err) {
      console.log(err);
    }

    // Invoke callback when done
    callback();
  });
}

function sfdcQuery() {
  conn.request(_request, function(err, resp) {
    console.log(resp);
    console.log(err);
  });
}

// Pass second function as callback to the first
sfdcAuth(sfdcQuery);

你也可以使用 Promise:

function sfdcAuth(callback) {
  return new Promise((resolve, reject) => {
    conn.login(process.env.sfdcUser, process.env.sfdcUserPass, (err, userInfo) => {
      if (err) {
        reject(err);
      }

      resolve(userInfo);
    });
  });
}

function sfdcQuery() {
  return new Promise((resolve, reject) => {
    conn.request(_request, function(err, resp) {
      if (err) {
        reject(err);
      }

      resolve(resp);
    });
  });
}

// Wait for promise to resolve before invoking second function
sfdcAuth()
  .then(result => {
    // Do something with result

    return sfdcQuery();
  })
  .then(result => {
    // You can continue the chain with
    // the result from "sfdcQuery" if you want
  })
  .catch(err => {
    // Handle error
  });
于 2019-10-17T17:38:48.643 回答