如何正确返回承诺中的多个值?

2022-08-30 05:42:22

我最近遇到过几次这种情况,我不知道如何正确解决。假定以下代码:

somethingAsync()
  .then( afterSomething )
  .then( afterSomethingElse )
  
function afterSomething( amazingData ) {
  return processAsync( amazingData );
}
function afterSomethingElse( processedData ) {
}

现在可能会出现一种情况,我希望能够访问 中。amazingDataafterSomethingElse

一个明显的解决方案是从 返回数组或哈希值,因为,您只能从函数返回一个值。但是我想知道是否有一种方法可以接受2个参数并同样调用它,因为这似乎更容易记录和理解。afterSomethingafterSomethingElse

我只是想知道这种可能性,因为有,它做了一些类似于我想要的事情。Q.spread


答案 1

您无法解析具有多个属性的承诺,就像无法从函数返回多个值一样。承诺在概念上表示一段时间内的值,因此虽然您可以表示复合值,但不能在承诺中放置多个值。

承诺本质上通过单个值解析 - 这是Q如何工作,Promises/ A +规范如何工作以及抽象如何工作的部分。

您可以获得的最接近的是使用和返回数组,或者使用ES6解构,如果它受支持,或者您愿意使用像BabelJS这样的转译工具。Q.spread

至于将上下文传递到承诺链,请参考Bergi在这方面的优秀规范


答案 2

您只能传递一个值,但它可以是一个包含多个值的数组,例如:

function step1(){
  let server = "myserver.com";
  let data = "so much data, very impresive";
  return Promise.resolve([server, data]);
}

另一方面,您可以使用 ES2015 的解构表达式来获取各个值。

function step2([server, data]){
  console.log(server); // print "myserver.com"
  console.log(data);   // print "so much data, very impresive"
  return Promise.resolve("done");
}

将两者都称为承诺,将它们链接起来:

step1()
.then(step2)
.then((msg)=>{
  console.log(msg); // print "done"
})