Promise.All之后你可以继续同步吗?

时间:2017-08-24 05:20:46

标签: javascript node.js promise es6-promise

假设我有以下代码:

var myData = [];

var future = Promise.All([getPromise1, getPromise2]).then((result)=>{
  var myData = result []
}).catch((err)=>{
  \\Do something with err
})

doSomething (myData);

收到promise.all结果中的数据后,我可以对myData做些什么吗?或者我必须处理promises .then()中的后续代码。

例如:

future.then((data)=>{
  doSomething(myData);
});

我觉得我必须创建一堆.then()才能继续处理任何类型的同步代码。虽然我认为因为myData是结果,所以任何使用结果中的数据的代码都应该作为该承诺的一部分来处理,如:

var future = Promise.All([getPromise1, getPromise2]).then((result)=>{
  doSomething(result [])
}).catch((err)=>{
  \\Do something with err
})

我只是理解这一切都错了吗? 期待着想法和意见!

P.S im on node.js

2 个答案:

答案 0 :(得分:0)

你是正确的,承诺的结果只能在承诺中使用。然后。

附注 - 后续承诺不一定需要嵌套,而是可以链接。例如:

myPromise(foo).then(bar => {
    // Do something with the result
    baz = bar * 2

    // Pass the result to some other promise
    return mySecondPromise(baz)
}).then(foo2 => {
    // Output the result of the second promise
    console.log(foo2)
}).catch(err => {
    console.error(err)
});

错误将沿着链传播。

答案 1 :(得分:0)

您必须处理.then()函数回调中的后续代码。你不能在承诺链之外做任何事情的原因是因为Promises的工作方式。关于异步javascript的快速谷歌搜索给出an explanation这就是为什么。简短的回答是doSomething(myData)将在.then()函数中的代码运行之前运行,这意味着当脚本到达代码中的那一点时,myData仍然是一个空数组。

实际上,即使代码在.then()方法之前以某种方式到达doSomething(myData)函数,myData仍然是一个空数组,因为在.then()函数中声明的myData完全是另一个变量,因为它被声明为

var myData

如果你想编写看起来更加同步的代码,我建议使用async/await,具体取决于你的node.js版本是否支持它,或者你是否正在使用转换器。使用async / await,您的代码将如下所示:

async function() {
    try {
        var myData = await Promise.all([getPromise1, getPromise2]);
        doSomething(myData);
    } catch (ex) {
        // Do something with err
    }
}