Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.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_Scope_Promise - Fatal编程技术网

Javascript 承诺嵌套与链接样式

Javascript 承诺嵌套与链接样式,javascript,scope,promise,Javascript,Scope,Promise,新的承诺;考虑“约定>())/代码>和约定(b)/代码>,这取决于第一个结果,并且我想收集这两个结果并执行第三个动作 DOM(A,B)< /代码>: 样式A(闭合/嵌套) 样式B(返回值/链接) 据我所知,这些是等效的: promiseA和promiseB 最终承诺返回未定义的 如果promiseA或promiseB被拒绝,或doSomething抛出,则最终承诺被拒绝 就风格而言,风格B减少了缩进(末日金字塔) 然而,样式B更难重构。如果我需要引入一个中间的promiseA2(a)和doS

新的承诺;考虑“<代码>约定>())/代码>和<代码>约定(b)/代码>,这取决于第一个结果,并且我想收集这两个结果并执行第三个动作<代码> DOM(A,B)< /代码>:

样式A(闭合/嵌套)

样式B(返回值/链接)

据我所知,这些是等效的:

  • promiseA
    promiseB
  • 最终承诺返回未定义的
  • 如果
    promiseA
    promiseB
    被拒绝,或
    doSomething
    抛出,则最终承诺被拒绝
就风格而言,风格B减少了缩进(末日金字塔)

然而,样式B更难重构。如果我需要引入一个中间的
promiseA2(a)
doSomething(a,a2,b)
,我需要修改3行(
Promise.all
spread
doSomething
),这可能导致错误(意外交换等),而对于样式a,我只修改1行(
doSomething
)变量名表明它是哪个结果。在大型项目中,这可能非常重要


这两种风格之间是否存在其他非功能性权衡?一种内存分配比另一种内存分配多/少?在事件循环中多转/少转?异常上更好/更差的堆栈跟踪?

我认为这两种方法之间的非功能性权衡并不是那么重要:第二种方法在创建数组和传播相应结果时有一定的开销,它将创造更多的承诺。然而,在异步流中,我认为所有这些都可以忽略不计

您主要关心的似乎是重构的易用性

为此,我建议使用一系列函数,并对其进行
reduce

[promiseA,promiseB,doSomething].reduce((prom,f)=>
prom.then((res=[])=>(f(…res)| | prom.then([].concat.bind(res)))
,Promise.resolve());
//样本函数
函数等待(毫秒){
返回新承诺(resolve=>setTimeout(resolve,ms));
}
功能允诺{
log('promiseA()');
返回等待(500)。然后(=>13);
}
功能承诺B(a){
log('promiseB('+a+'));
返回等待(500)。然后(=>a+2);
}
功能剂量测定法(a,b){
log('doSomething('+a+','+b+'));

}
const resultA=wait promiseA();const resultB=等待承诺(resultA);剂量测定法(resultA,resultB)另请参见,以了解不同方法的概述
promiseA().then(function (resultA) {
  return (promiseB(resultA).then(function (resultB) {
    doSomething(resultA, resultB);
  }));
});
promiseA().then(function (resultA) {
  return Promise.all([resultA, promiseB(resultA)]);
}).spread(function (resultA, resultB) {
  doSomething(resultA, resultB);
});