如何使用链接让一个函数等待另一个函数在 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 触发得太快了。
我如何使用链接和承诺来解决这个问题?
当你使用异步代码时,你通常会处理 Promise
s,你已经用 .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()
我有一个函数可以通过其其余部分从 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 触发得太快了。
我如何使用链接和承诺来解决这个问题?
当你使用异步代码时,你通常会处理 Promise
s,你已经用 .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()