在承诺之后,你能同步继续吗?



假设我有以下代码:

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

在 myData 收到来自 promise.all 结果的数据后,我可以对它做一些事情吗?还是我必须在 promise .then(( 中处理后续代码。

例如:

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

我觉得我必须创建一堆 .then(( 才能继续处理任何类型的同步代码。虽然我想既然myData是结果,那么任何使用结果数据的代码都应该作为该承诺的一部分进行处理,例如:

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

我只是理解错了吗? 期待想法和意见!

附言我在节点上工作.js

你是对的,承诺的结果只能在承诺的 .then 中使用。

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

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)
});

错误将沿链向下传播。

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

实际上,即使代码确实在doSomething(myData)方法之前以某种方式到达了.then()函数,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
}
}

最新更新