2017-07-30 213 views
4

我刚刚升级到节点8,并想开始使用异步/等待。我偶然发现了一个错误,这让我花了一段时间才解决,而我实际上只是想知道是否有更优雅的方式。我不想在这个时候重构整个函数,因为它会导致所有次要的重构。在promise链中使用await

async doSomething(stuff) { 
... 

    return functionThatReturnsPromise() 
    .then((a) => ...) 
    .then((b) => ...) 
    .then((c) => { 
     const user = await someService.createUser(stuff, c); 
     user.finishSetup(); 
    }); 
}; 

有什么办法能在承诺连锁使用await而无需重构上面的一切是async呢?

+3

应该不是被'。然后(异步(C)=> {'是在所有有效? –

+0

这可能是我之前这个捣乱的时候错过了......我已经包裹在全产业链一个异步IEFE。谢谢! –

+0

在这个简单的例子中,我不需要等待,但是在我有的真实代码中,有些东西需要对用户进行操作。 –

回答

4

该回调未声明为async函数。您只能在async函数内直接使用await a Promise

async doSomething(stuff) { 
// ... 

    return functionThatReturnsPromise() 
    .then((a) => /* ... */) 
    .then((b) => /* ... */) 
    .then(async (c) => { 
     const user = await someService.createUser(stuff, c); 
     return user; 
    }); 
}; 

而且,你不应该需要使用then如果你正在利用async功能。

async doSomething(stuff) { 
// ... 

    const a = await functionThatReturnsPromise(); 
    const b = // ... 
    const c = // ... 
    const user = await someService.createUser(stuff, c); 
    return user; 
}; 
+0

是的,我现在明白了@Jaromanda X的感谢。我也明白,如果我将整个函数转换为async/await,这不是一个问题,但这是应用程序的核心功能,我宁可不触摸比我更多,因此努力保留承诺链,并添加我需要的新作品。 –

+0

如果我将整个函数转换为async/await_,你的意思是什么?你可以在'async'函数内'等待'Promise'。 –

+0

现在整个功能是一个长期的承诺链。我想避免将链中的每个“链接”转换为“等待”。 –