Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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_Node.js_Promise_Async Await - Fatal编程技术网

Javascript 承诺与周期

Javascript 承诺与周期,javascript,node.js,promise,async-await,Javascript,Node.js,Promise,Async Await,有一个承诺链,第一个从数据库中获取用户id,然后我需要从数据库中获取他的组和构造函数的名称 这些可以是多个副本 结果是一个循环接着一个循环。最终我只收到一个用户的对象 异步类 .thenids=>{ //console.logids,id; 对于变量i=0;i{ data.idvk=idm; takeIdgdata.id .thenres=>{ 数据 .thendata=>{ console.logdata,数据; } .catcherr=>{ console.logerr; }; } .ca

有一个承诺链,第一个从数据库中获取用户id,然后我需要从数据库中获取他的组和构造函数的名称 这些可以是多个副本 结果是一个循环接着一个循环。最终我只收到一个用户的对象

异步类 .thenids=>{ //console.logids,id; 对于变量i=0;i{ data.idvk=idm; takeIdgdata.id .thenres=>{ 数据 .thendata=>{ console.logdata,数据; } .catcherr=>{ console.logerr; }; } .catcherr=>{ console.logerr; }; } .catcherr=>{ console.logerr; }; } } 凯瑟先生{ console.logerr; }; 考虑使用真正的async/await语法,而不是带有async和await函数的库

const ids = await takeIds();
// console.log("ids", ids);
try {
  for (var i = 0; i < ids.length; i++) {
    data.id = ids[i];
    const idem = await takeIdvk(ids[i]);
    data.idvk = idm;
    const res = await takeIdg(data.id);
    console.log("data", await takeNamesCycle(res, data));
  }
} catch(err) {
  console.log(err);
}

发布的代码混合了wait中的承诺链样式的代码和坏代码中的异步函数

First Wait不允许对其返回的值调用.then或.catch方法。原因是wait返回的值永远不是承诺。Wait仅在成功的承诺操作后恢复执行,并返回操作结果。比如说

await (takeIdvk(ids[i])
.then(idm => {           // incorrect
     data.idvk = idm;
     // ... more code
变成

let idm = await takeIdvk(ids[i])   // await returns fulfilled value
data.idvk = idm;
// ... more code
换句话说,用于处理成功操作的数据的代码是在等待后内联编写的,而不是在作为参数传递给的单独onCompleted处理程序中

拒绝承诺

如果等待的承诺被拒绝,等待操作符将抛出拒绝原因,而不恢复函数执行

可以在try/catch块中捕获拒绝,以便忽略错误,重复操作,或者根据应用程序要求用不同的操作替换它。例如

let idm;
try {
    idm = await takeIdvk(ids[i])   // await returns fulfilled value
    data.idvk = idm;
    // ... more code
} catch( err) {
    console.log( "ignoring error + err);
    // the value of idm is undefined
}
另一方面,如果拒绝被认为是致命的,不要将wait放在try/catch块中-抛出的值将被捕获并用于拒绝异步函数返回的承诺,就像在then或catch处理程序中抛出错误一样

如果对异步函数的调用是嵌套的,每个调用都使用wait而没有任何try/catch块,则拒绝错误将从深度嵌套的函数中冒出来,并拒绝最外层异步函数调用返回的承诺。最外层承诺上的单个.catch子句可用于防止未捕获的承诺拒绝,并通知发生了失败

结论


如果您更熟悉该语法,请尝试使用普通承诺链编写代码。无论如何,请继续将其转换为async/await语法,但请注意async/await是一种替代语法,它们不能很好地混合在同一个函数中。正如@Bergi所述,从异步函数返回一个新的承诺是一种反模式-异步函数已经返回了一个承诺。

您只需要在最高级别捕获。@JonasW。你的意思是什么?是的,我同意乔纳斯的观点,看起来你在中间接球方面做的事情并不多,所以只要去掉所有的,除了最后的等待抛出了拒绝等待承诺的理由。在没有干预的情况下,出于同样的原因,它拒绝异步函数返回的承诺。顶级异步函数调用返回的承诺上的单个catch子句应捕获其下所有未捕获的拒绝。在期待已久的承诺上加上“捕获”条款会将拒绝转化为履行。如果在拒绝后等待返回,处理垃圾数据将继续。@traktor53,那么我需要在我的第一个承诺中只使用一个捕获吗?我会试着写在这里,我输了,说我有一个旧版本的节点。。。4.2.6. 我不知道有没有可能在没有问题的情况下更新它,你一定要更新。我想不出它会引起什么问题。如果你不能,你仍然可以使用一个传送机。
let idm;
try {
    idm = await takeIdvk(ids[i])   // await returns fulfilled value
    data.idvk = idm;
    // ... more code
} catch( err) {
    console.log( "ignoring error + err);
    // the value of idm is undefined
}