[英]Wait for async task to finish
我正在与第三方 JavaScript 库交互,其中一些 function 调用是异步的。 我没有将异步逻辑应用到我的应用程序中,而是更喜欢为那些异步调用编写同步包装器。 我知道,我知道,这是糟糕的设计,但这是一个很有可能被完全重写的演示项目。 我需要一些东西来向团队展示这个概念,而不必真正担心性能。
这是我想做的:
function sync_call(input) {
var value;
// Assume the async call always succeed
async_call(input, function(result) {value = result;} );
return value;
}
我尝试了 jQuery 的 deferred 和 promise 但它似乎是针对异步设计模式的。 我想在我的代码中使用同步模式。
这将永远不会起作用 ,因为JS VM已经从async_call继续并返回了您尚未设置的值。
不要试图打击自然和内置的语言行为。 您应该使用回调技术或承诺。
function f(input, callback) {
var value;
// Assume the async call always succeed
async_call(input, function(result) { callback(result) };
}
另一种选择是使用承诺,看看Q. 这样你就可以返回一个promise,然后你将一个then侦听器附加到它,这与回调基本相同。 当promise解决后,将触发。
如何在回调中调用函数而不是在sync_call()中返回值?
function sync_call(input) {
var value;
// Assume the async call always succeed
async_call(input, function(result) {
value = result;
use_value(value);
} );
}
这是一个如何工作的示例:-
function testAsync(){
return new Promise((resolve,reject)=>{
//here our function should be implemented
setTimeout(()=>{
console.log("Hello from inside the testAsync function");
resolve();
;} , 5000
);
});
}
async function callerFun(){
console.log("Caller");
await testAsync();
console.log("After waiting");
}
callerFun();
输出:
Caller
Hello from inside the testAsync function
After waiting
为了使其更完整,应该添加错误处理(处理 reject() 情况)。
有关其他示例,请参见此处: https://www.delftstack.com/howto/javascript/javascript-wait-for-function-to-finish/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.