如何确保一个功能在其他功能之前完成

How to ensure that one function completes before other function

我是 Node.js 的新手,我想要实现的是拥有两个独立的功能。一个用于 Auth,一个用于发送数据(如果我在 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 是异步的,它 运行 无需等待第一个函数完成即可执行第二个函数。

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

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

您还可以使用 promises:

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