我在通过我设置的承诺链传递参数时遇到了一些问题.这是我正在尝试做的一个基本的例子.
var dummyReq = { client: null }; var dummyUser = { email: 'user@secretdomain.com',password: 'admin' }; function printEmail(request,user) { return new Promise((resolve,reject) => { console.log('Email:',user.email); return resolve(request,user); }); } function printPassword(request,reject) => { console.log('Password:',user.password); // <-- user is undefined return resolve(request,user); }); } printEmail(dummyReq,dummyUser) .then(printPassword) .catch(function(error) { console.log('Unexepected error has occured'); });
在第二个promise中,参数user是未定义的,我如何通过promise链传递多个参数,因为这些promises继续将更多信息添加到链中,到最后我将5个值传递给最后一个promise.
我应该只使用ES6运算符将它们组合成一个对象并在每次调用时解构它们吗?例如return resolve({request,user})然后是const {request,user} = param
解决方法
你走在正确的轨道上. Promise对象包含一个已实现的值,该值将传递给onfulfilled反应处理程序.非承诺价值,或承诺最终实现时履行的价值,用于履行承诺链中的下一个承诺.如果要将多个值传播到下一个promise处理程序,则必须使用单个对象值来执行此操作.
因此,我们假设printEmail和printPassword实际上是异步而不是帖子中的同步操作.
printEmail变为:
function printEmail(request,user.email); resolve( {request,user} ); }); }
在新承诺的执行人内部没有“返回”声明 –
不使用执行程序函数的返回值,通常是未定义的.
printPassword成为
function printPassword(data) { return new Promise((resolve,data.user.password); resolve(data); }); }}
是否将数据对象解构为变量是一种风格而不是技术问题.类似地,无论是将同一个对象传递给Promise链中的多个处理程序,还是根据需要删除或添加属性,或者只创建一个只包含后续步骤所需属性的新对象,完全取决于选择和样式.