Как убедиться, что одна функция завершается раньше другой - PullRequest
0 голосов
/ 17 октября 2019

Я довольно новичок в 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 асинхронный, он запускает вторую функцию, не дожидаясь завершения первой функции.

1 Ответ

2 голосов
/ 17 октября 2019

Самый простой способ - передать вторую функцию в качестве обратного вызова вашей первой функции, которую она может вызвать по завершении:

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

Вы также можете использовать обещания:

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