Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何推迟函数执行?_Javascript_Asynchronous_Callback - Fatal编程技术网

Javascript 如何推迟函数执行?

Javascript 如何推迟函数执行?,javascript,asynchronous,callback,Javascript,Asynchronous,Callback,假设我有一个Javascript API,它由两个函数组成,第一个函数在调用回调之前执行一些异步工作: function api1(args, callback) { some_async_op(function() { callback() }) } function api2(arg) { ... } 重要的是,只有在api1完成其异步工作并调用其回调后,才允许api2执行其工作。然而,对这些API的客户端调用通常是同步的,即 api1(arg, funct

假设我有一个Javascript API,它由两个函数组成,第一个函数在调用回调之前执行一些异步工作:

function api1(args, callback) {
   some_async_op(function() {
       callback()
   })
}
function api2(arg) {
   ...
}
重要的是,只有在api1完成其异步工作并调用其回调后,才允许api2执行其工作。然而,对这些API的客户端调用通常是同步的,即

api1(arg, function() { ... })
...
api2(arg)

如何实现
api2()
,使其在
api1()
完成之前无法运行?显然,
api2()
调用可以放在传递给
api1()
的回调中,但我正在寻找一个替代方法。

异步编程在javascript中似乎无处不在,您可以期望用户只需使用
api1
返回的承诺,或者让
api2
仅作为
api1
异步返回的对象上的方法可用

我不太愿意发表这篇文章,因为它让人感觉很粗糙,但也许它会激发一些有用的东西。您可以在
api1
api2
共享承诺的地方做一些事情。这就迫使api2的主要功能成为promise上的
then()
。如果您需要对这对函数执行多个独立调用,那么这可能会变得很糟糕

const some\u async\u op=cb=>setTimeout(cb,500)
设分解器,p
功能api1(cb){
如果(!p)p=新承诺(解析=>{
解析程序=解析
})
一些异步操作(()=>{
cb()
分解器()
})
}
函数api2(){
(p | |)(p=新承诺(解决=>{
解析程序=解析
})))
。然后(()=>console.log('API2完成'))
}
//先打电话给api2
api2()
//稍后打电话给api1

setTimeout(()=>api1(()=>console.log('api1 callback fired'),600))
为什么不让api1返回一个承诺,然后用户可以将该承诺的辅助函数调用链接起来?是不是一旦api1()执行,api2()就可以随时执行?或者,api1()是否总是必须在api2()之前重新执行?这些API调用是否在浏览器或Node.js中执行?如果客户端在不应该同步调用API的情况下同步调用API,则您的API需要修复,或者您的文档在
api1()的回调中调用
api2()