Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.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 承诺返回异步函数内的多个resolve()调用_Javascript_Node.js_Promise - Fatal编程技术网

Javascript 承诺返回异步函数内的多个resolve()调用

Javascript 承诺返回异步函数内的多个resolve()调用,javascript,node.js,promise,Javascript,Node.js,Promise,我有以下testAsync函数,在调用resolve之后,它应该返回resolved promise 异步函数等待时间{ 等待新PromiserSolve,拒绝=>{setTimeoutresolve,time}; } 异步函数testAsynctestParam{ 返回新的承诺异步解析,拒绝=>{ 试一试{ wait wait2000;//执行一些异步工作 如果testParam==1{ console.logtest参数等于1; 首先,如果; } 如果testParam{ 让结果=等待测试同

我有以下testAsync函数,在调用resolve之后,它应该返回resolved promise

异步函数等待时间{ 等待新PromiserSolve,拒绝=>{setTimeoutresolve,time}; } 异步函数testAsynctestParam{ 返回新的承诺异步解析,拒绝=>{ 试一试{ wait wait2000;//执行一些异步工作 如果testParam==1{ console.logtest参数等于1; 首先,如果; } 如果testParam<10{ console.logtest参数小于10; 第二个如果; } }捕捉错误{ 拒绝错误; } }; } 异步=>{ 让结果=等待测试同步1; console.logresult; }; 控制台输出:

test param is equal to 1
test param is smaller than 10
first IF
我的问题是,如果我以一种包含更多非独占性解析调用的方式构造代码,那么代码会解析它遇到的第一个调用,但不会停止并返回到该位置。为什么会继续?解析不等于返回吗?是否应该在每次解析调用后添加return?

返回新PromiseAncy resolve,reject=>{是反模式。在函数前面添加async将已经返回承诺。新承诺只能用于将无承诺基异步函数转换为使用承诺的函数

解析不等于返回吗

它只在设置承诺的返回值的意义上是相等的,但它不会中断执行流。因此,如果要防止执行后续代码,则需要在解析后放置一个返回

但正如我已经说过的,所示的构造无论如何都是反模式的,testAsync应该如下所示:

async function testAsync(testParam) {
  await wait(2000); // do some async work

  if (testParam === 1) {
    console.log("test param is equal to 1");
    return "first IF";
  }

  if (testParam < 10) {
    console.log("test param is smaller than 10");
    return "second IF";
  }
}

调用resolve或reject将不会退出函数返回。函数中的其余代码将被执行。但是,将忽略对resolve和reject的进一步调用。!我不记得从何处开始使用此模式,但如果能纠正几个月来出现的错误,我会感觉很好。在我的情况下,需要第二次异步,因为我一直在等待没有它的节点抛出一个错误:SyntaxError:await仅在异步中有效function@miran80我添加了您显示的代码应该是什么样子。如果您已经使用了wait,那么使用新的Promise和resolve/reject是没有意义的。哇,谢谢!我不知道为什么我从来没有尝试过这个,但它看起来更好,少了一些样板,凹痕少,很美。
function wait(time) {
    return new Promise((resolve, reject) => { setTimeout(resolve, time) });
}