问题:
是否可以等待启动新异步函数的异步函数?
的详细说明:
在查找代码或运行特定函数或代码块之前,我已经查找了一些等待异步函数完成的方法。但有一件事已经让我困扰了很长时间 - 我不知道是否还在等待新的异步函数,或者是否需要考虑他们自己的代码。
伪代码:
var value = 1;
af1();
alert(value);
async function af1(){
af2();
}
async function af2(){
af3();
}
async function af3(){
value = 2;
}
我不知道这是一个很好的例子(甚至是正确的语法),但是将异步函数描述为一些需要一些时间才能完成的ajax请求。我有一种感觉,如果你在af1上添加一个延迟的jQuery,它只会等待af1并忽略af2和af3。我也在使用外部javascript文件来实现某些功能,而且我无法控制在那里启动哪些新功能。
再说一遍,是否可以将所有这些包装成某些内容并在完成后运行一些代码?或者我误解了jQuery的延迟和.done函数??
答案 0 :(得分:1)
不,调用时不等待async
个函数。他们只返回promise。
在async
函数中 - 这是他们的优势 - 您可以明确await
个承诺,包括从其他async
函数返回的承诺。
您的代码应该使用返回值编写,如下所示:
(async function() { // neccessary to use await
value = await af1();
alert(value);
}());
af1().then(alert); // or just using promise syntax
async function af1(){
return af2();
}
async function af2(){
return af3();
}
async function af3(){
return 2; // or maybe rather something like
return $.ajax(…);
}
但是您不需要返回值,您也可以使用await
作为闭包方法:
(async function() {
var value = 1;
await af1();
// ^^^^^
alert(value);
async function af1(){
await af2();
}
async function af2(){
await af3();
}
async function af3(){
value = 2; // or maybe rather something like
value = await $.ajax(…);
}
}())
答案 1 :(得分:1)
使用此git js ASync
如何使用
Async提供了大约20个函数,包括通常的“功能”嫌疑(map,reduce,filter,each ......)以及异步控制流的一些常见模式(parallel,series,waterfall ...)。所有这些函数都假设您遵循Node.js惯例,即提供单个回调作为异步函数的最后一个参数。
快速示例
async.map(['file1','file2','file3'], fs.stat, function(err, results){ // results is now an array of stats for each file }); async.filter(['file1','file2','file3'], fs.exists, function(results){ // results now equals an array of the existing files }); async.parallel([ function(){ ... }, function(){ ... } ], callback); async.series([ function(){ ... }, function(){ ... } ]);
还有更多可用功能,因此请查看下面的文档以获取完整列表。这个模块旨在全面,所以如果你觉得有任何遗漏,请为它创建一个GitHub问题。
答案 2 :(得分:0)
除以上示例外,请查看以下代码示例。异步和等待的概念会更清楚。
async function doWork(){
try {
const response = await makeRequest('facebook'); //using await will wait until the response returned from the makeRequest function
//console.log('Response Received' + response );
const response2 = await makeRequest('google');
//console.log('Response2 Received' + response2 );
} catch(err) {
alert(err);
}
}
function makeRequest(str){
//function body that takes time to process, eg: server call
return "making request to " + str;
}
doWork();