Javascript 努力等待循环
我现在在这里有这个功能Javascript 努力等待循环,javascript,node.js,async-await,Javascript,Node.js,Async Await,我现在在这里有这个功能 async function checkEntry(results: any) { let ind = 0; for (let i = 0; i < results.length; i++) { const e = results[i]; await checkStuff(e); // returns void await checkOtherStuff(e); //returns void
async function checkEntry(results: any) {
let ind = 0;
for (let i = 0; i < results.length; i++) {
const e = results[i];
await checkStuff(e); // returns void
await checkOtherStuff(e); //returns void
await updateStatus(e); //returns void aswell
ind++;
await sleep(1);
}
}
不提供承诺接口,wait
不会神奇地让代码等待异步任务完成
它是一种合成糖,使其更容易与承诺一起工作,需要承诺才能工作
如果像https.get
这样的函数不提供承诺接口,那么您需要以某种方式将其转换为承诺,例如将新承诺((解析、拒绝)=>…)
包装在其周围
const req = await new Promise((resolve, reject) => {
https.get(result.url, async (res) => {
if(res.statusCode == 404) console.log(result.url+' returns 404');
resolve()
});
req.on("error", (e) => {
reject(e)
});
})
不提供承诺接口,wait
不会神奇地让代码等待异步任务完成
它是一种合成糖,使其更容易与承诺一起工作,需要承诺才能工作
如果像https.get
这样的函数不提供承诺接口,那么您需要以某种方式将其转换为承诺,例如将新承诺((解析、拒绝)=>…)
包装在其周围
const req = await new Promise((resolve, reject) => {
https.get(result.url, async (res) => {
if(res.statusCode == 404) console.log(result.url+' returns 404');
resolve()
});
req.on("error", (e) => {
reject(e)
});
})
如果您使用的是wait关键字,则需要在承诺中使用它 当前,
checkStuff
没有返回承诺,因此在执行回调时,您可以调整代码以解析承诺
consthttps=require('https');
函数检查(结果){
返回新承诺((解决、拒绝)=>{
const req=https.get(result.url,(res)=>{
如果(res.statusCode==404){
log(result.url+'返回404');
拒绝(res);
}否则{
决议(res);
}
});
请求开启('错误',(e)=>{
控制台错误(e);
拒绝(e);
});
}).catch((e)=>{
控制台日志(e);
});
}
回调和承诺是不同的
当一个方法接受回调时,它说,当我完成这个任务时,我将调用您选择的函数
使用承诺时,创建一个承诺对象并返回它。它将一直处于“待定”状态,直到承诺中的某些内容调用resolve或reject。您可以像这样将结果传递到resolve或rejectresolve(data)
现在,通过将此承诺分配给async
函数中的变量,您已经解锁了wait
关键字<代码>等待将阻止代码移动到下一行,直到承诺得到解决,因此这有助于使代码同步
异步函数main(){
const result=等待checkStuff();
/*
结果现在是处于挂起状态的承诺对象。
代码将不会继续超过前一行
直到结果变量从挂起变为已解决。
*/
控制台日志(结果);
}
如果您正在使用wait关键字,则需要在承诺中使用它 当前,
checkStuff
没有返回承诺,因此在执行回调时,您可以调整代码以解析承诺
consthttps=require('https');
函数检查(结果){
返回新承诺((解决、拒绝)=>{
const req=https.get(result.url,(res)=>{
如果(res.statusCode==404){
log(result.url+'返回404');
拒绝(res);
}否则{
决议(res);
}
});
请求开启('错误',(e)=>{
控制台错误(e);
拒绝(e);
});
}).catch((e)=>{
控制台日志(e);
});
}
回调和承诺是不同的
当一个方法接受回调时,它说,当我完成这个任务时,我将调用您选择的函数
使用承诺时,创建一个承诺对象并返回它。它将一直处于“待定”状态,直到承诺中的某些内容调用resolve或reject。您可以像这样将结果传递到resolve或rejectresolve(data)
现在,通过将此承诺分配给async
函数中的变量,您已经解锁了wait
关键字<代码>等待将阻止代码移动到下一行,直到承诺得到解决,因此这有助于使代码同步
异步函数main(){
const result=等待checkStuff();
/*
结果现在是处于挂起状态的承诺对象。
代码将不会继续超过前一行
直到结果变量从挂起变为已解决。
*/
控制台日志(结果);
}
能否显示支票功能的代码?它必须返回一个承诺才能工作。
checkStuff(e)
etc承诺吗?您需要确保,您的方法返回了承诺。我可以看到,checkStuff
没有返回任何内容。因此我需要在checkStuff中创建一个新的承诺,然后在https.get回调中解析它?@Retosi您接受的答案的解释有点误导。您应该阅读更多关于wait
和async
如何工作的信息。我试图解释你接受的答案在评论部分有什么误导性。你能展示一下你的checkStuff函数的代码吗?它必须返回一个承诺才能工作。checkStuff(e)
etc承诺吗?您需要确保,您的方法返回了承诺。我可以看到,checkStuff
没有返回任何内容。因此我需要在checkStuff中创建一个新的承诺,然后在https.get回调中解析它?@Retosi您接受的答案的解释有点误导。您应该阅读更多关于wait
和async
如何工作的信息。我试着在评论部分对你接受的答案解释什么是误导性的。回答不错,只是一个小小的观察。“使您的代码同步”,。它使代码看起来像是同步的,但从技术上讲它仍然是异步的。Result现在是处于挂起状态的Promise对象。代码将不会继续超过前一行u