【问题标题】:How to have one function wait for another function to finish processing in javascript using chaining?如何让一个函数等待另一个函数使用链接在 javascript 中完成处理?
【发布时间】:2018-07-07 09:18:09
【问题描述】:

我有一个函数,它通过它的 rest api 从 firebase 中提取一个数组,我需要将它输入到另一个函数中来创建一个日历。

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 触发时间要长一些。

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

【问题讨论】:

  • 你能把代码贴在这里array_from_firebase()
  • 提供你到目前为止所做的事情(我假设,你应该做的,你先做了一些研究)
  • firebase 文档应该清楚如何访问结果
  • 两者都不应该工作。无论array_from_firebase 做什么,都是错误的。

标签: javascript jquery chaining


【解决方案1】:

您可以从第一个函数返回一个承诺。在这个例子中,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。在这种情况下,需要将等待另一个函数结果的函数声明为async,并在返回结果的函数之前声明await关键字。

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

【讨论】:

    【解决方案2】:

    当您使用异步代码时,您通常会处理 Promises,您可以处理 .then.catch 块,以强制您的函数等待响应。我模拟了array_from_firebase函数内部的异步调用,它在3秒后返回响应,响应是Promise。然后你可以通过.then块处理这个promise(如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();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 2016-09-20
      • 1970-01-01
      相关资源
      最近更新 更多