如何使用链接让一个函数等待另一个函数在 javascript 中完成处理?

How to have one function wait for another function to finish processing in javascript using chaining?

我有一个函数可以通过其其余部分从 firebase 中提取一个数组 api,我需要将其输入到另一个函数中以创建日历。

function array_from_firebase(){
    //code that pulls from firebase
    return array
}

function calendar_create_from_array(array){
    //code that generates calendar
}

以下无效:

calendar_create_from_array(array_from_firebase())

但是,这确实有效

array = array_from_firebase()
setTimeout(calendar_create_from_array,9000,array)

我认为这意味着 array_from_firebase 比 calendar_create_from_array 花费的时间要长一点,并且 calendar_create_from_array 触发得太快了。

我如何使用链接和承诺来解决这个问题?

当你使用异步代码时,你通常会处理 Promises,你已经用 .then.catch 块处理过,以强制你的函数等待响应。我在 array_from_firebase 函数中模拟了异步调用,它在 3 秒后 returns 响应,响应是 Promise。然后你可以通过 .then 块处理这个承诺(如 calendar_create_from_array 函数所示),它会被执行,当你得到没有错误的响应时, .catch 块将被执行你得到错误的回应。像这样:

function array_from_firebase() {
  // Simulate async response
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve([1,2,3]);
    }, 3000);
  })
}

function calendar_create_from_array() {
    array_from_firebase()
      .then(function(response) {
        console.log(response);
      })
}

calendar_create_from_array();

从第一个函数你可以return一个承诺。在这个例子中使用 setTimeout 只是为了演示下一个函数在第一个函数

之后执行

function array_from_firebase() {
  return new Promise(
    function(resolve) {
      setTimeout(function() {
        return resolve([1, 2, 3])
      }, 4000)
    },
    function(reject) {})
}

function calendar_create_from_array(array) {
  console.log(array);
}

array_from_firebase().then(function(resp) {
  calendar_create_from_array(resp)
})

你也可以使用 async & await.In 在这种情况下,等待另一个函数结果的函数需要声明为 async 并在函数之前声明 await 关键字这将 return 结果。

function array_from_firebase() {
  return new Promise(

    function(resolve) {
      setTimeout(function() {
        return resolve([1, 2, 3])
      }, 5000)

    },
    function(reject) {})
}

async function calendar_create_from_array() {
  console.log('Calling function and waiting for result for 5secs....')
  let getResult = await array_from_firebase();
  console.log('Got result after 5secs', getResult)
}
calendar_create_from_array()