如何将瀑布方法转换为承诺



下面是使用异步瀑布方法的代码片段。我如何使用承诺转换它。

async.waterfall([
function(callback){
User.update({username: user.username}, {$set: update_list}, function(err, a_user) {
if (err) {
err = new Error();
err.code = 400;
err.message = "Unexpected error occurred."
callback(err)
}
if (!a_user) {
err = new Error();
err.code = 400;
err.message = "User not found."
callback(err)
}else{
callback(null, "updated", user_image);
}
})
}, function(message, user_image, callback){
if(user_image == undefined){
callback(null, "done")
}else{
Bean.update({username: user.username, status:"Active"}, {$set: {user_image:user_image}},{multi:true},function(err, beanUpdated){
if(err){
err = new Error();
err.code = 400;
err.message = "Unexpected error occurred."
callback(err)
}else{
callback(null, "done"); 
}
})
}
}
], function(err, result){
if(err){
return res.json({code:err.code, message:err.message})
}else{
return res.json({code:200, message:"Successfully updated profile."})
}
})

我通常使用异步模块的瀑布和系列方法来同步我的 Node js 代码。帮助我从异步切换到承诺。

我不会为您重写代码,但将为您提供足够的信息,以便您可以自己以 3 种不同的风格自己完成,并举例演示这些概念。重写代码将给你一个熟悉承诺的好机会。

您可以使用返回 promise并从then回调返回这些承诺的函数,而不是接受回调并使用async.waterfall编写它们的函数,以便在下一个then中使用这些承诺的解析值:

f1().then((a) => {
return f2(a);
}).then((b) => {
return f3(b);
}).then((c) => {
// you can use c which is the resolved value
// of the promise returned by the call to f3(b)
}).catch((err) => {
// handle errors
});

在这个简单的示例中,可以简化为:

f1()
.then(a => f2(a))
.then(b => f3(b))
.then((c) => {
// use c here
}).catch((err) => {
// handle errors
});

甚至这个:

f1().then(f2).then(f3).then((c) => {
// use c here
}).catch((err) => {
// handle errors
});

或者您可以轻松地将它们与async/await组合在一起:

let a = await f1();
let b = await f2(a);
let c = await f3(b);
// ...

甚至在这种特殊情况下:

let c = await f3(await f2(await f1()));

在这里,您可以使用try/catch处理错误:

try {
let c = await f3(await f2(await f1()));
// use the c here
} catch (err) {
// handle errors
}

使用await的代码必须位于使用async关键字声明的函数内部,但您可以通过包装如下内容在任何地方使用它:

// not async function - cannot use await here
(async () => {
// this is async function - you can use await here
})();
// not async function again - cannot use await

(async () => { ... })()表达式本身返回一个承诺,该承诺被解析为异步函数的返回值,或者被拒绝并引发异常。

请注意,在上面的例子中,每个函数都可以很容易地依赖于前一个函数返回的解析承诺的值,即async.waterfall的确切用例,但我们没有为此使用任何库,只有语言的本机功能。

await语法在带有和谐标志的 Node v7.0+ 和不带任何标志的 v7.6+ 中可用。看:

  • http://node.green/#ES2017-features-async-functions

有关更多示例,请参阅此答案:

  • 节点.js ~ 构造 Promise 解析的链式序列

有关更多背景信息,请参阅此答案的更新以获取更多信息:

  • jQuery:在 ajax 调用成功后返回数据

相关内容

  • 没有找到相关文章

最新更新