将参数传递给promise链

时间:2017-01-24 02:01:56

标签: javascript

我在通过我设置的承诺链传递参数时遇到了一些问题。这是我正在尝试做的一个基本例子。

<div class="top-block-container">
  <h1 class="top-block">ECWMF</h1>
  <div class="top-block-dropdown">
    <p class="dropdown-option-heading">Global Models</p>
    <p class="dropdown-option">GFS</p>
    <p class="dropdown-option">ECMWF</p>
    <p class="dropdown-option">CMC</p>
    <p class="dropdown-option">NAVGEM</p>
    <p class="dropdown-option">UKMET</p>
    <p class="dropdown-option-heading">Mesoscale Models</p>
    <p class="dropdown-option">HRRR</p>
    <p class="dropdown-option">HWRF</p>
    <p class="dropdown-option">NAM 32km</p>
    <p class="dropdown-option">NAM 12km</p>
    <p class="dropdown-option">RAP</p>
    <p class="dropdown-option">SREF</p>
    <p class="dropdown-option last-option">HIRESW</p>
  </div>
</div>

在第二个承诺中,参数user是未定义的,如何通过promise链传递多个参数,因为这些promises会继续向链中添加更多信息,到最后我将5个值传递给最后的承诺。

我应该只使用ES6运算符将它们组合成一个对象并在每次调用时解构它们吗?例如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, user) { return new Promise((resolve, 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'); }); 然后return resolve({request, user})

1 个答案:

答案 0 :(得分:8)

你走在正确的轨道上。 Promise对象包含一个已实现的值,该值将传递给onfulfilled反应处理程序。非承诺价值,或承诺最终实现时履行的价值,用于履行承诺链中的下一个承诺。如果要将多个值传播到下一个promise处理程序,则必须使用单个对象值来执行此操作。

因此,让我们假设printEmailprintPassword实际上做了异步而不是帖子中的同步操作。

printEmail成为:

function printEmail(request, user) {
    return new Promise((resolve, reject) => {
        console.log('Email:', user.email);
        resolve( {request, user} );
    });
}

没有&#34;返回&#34;新承诺遗嘱执行人的声明 - 不使用执行程序函数的返回值,通常为undefined

printPassword成为

function printPassword(data) {
    return new Promise((resolve, reject) => {
        console.log('Password:', data.user.password);
        resolve(data);
    });
}}

无论是否将数据对象解构为变量都是一种风格而非技术问题。类似地,是否将同一个对象传递给promises链中的多个处理程序,如果需要,删除或添加属性,或者只创建一个只包含后续步骤所需属性的新对象,这完全取决于选择和样式。