链接.then()调用ES6承诺

时间:2017-01-09 20:20:18

标签: javascript es6-promise

我认为在使用ES6 Promises时应该可以链接.then()方法。换句话说,我认为当解析promise时,传递给resolve函数的值应该传递给任何链接的然后处理程序。如果是这样, value 在下面的链式然后处理程序中是否未定义?

function createPromise() {
  return new Promise((resolve) => {
    resolve(true);
  });
}

createPromise()
  .then((value) => {
    console.log(value); // expected: true, actual: true
  })
  .then((value) => {
    console.log(value); // expected: true, actual: undefined
  });

3 个答案:

答案 0 :(得分:7)

每个then()都可以返回一个值,该值将用作下一个then()调用的已解析值。在您的第一个then()中,您不会返回任何内容,因此value在下一个回调中未定义。在第一个中返回value以使其在第二个中可用。



function createPromise() {
  return new Promise((resolve) => {
    resolve(true);
  });
}

createPromise()
  .then((value) => {
    console.log(value); // expected: true, actual: true
    return value;
  })
  .then((value) => {
    console.log(value); // expected: true, actual: true
  });




答案 1 :(得分:2)

你必须将它返回到承诺中以传递它。或者创建一个随之解决的新承诺。

createPromise()
.then((value) => {
    return value;
})
.then((value) => {
    console.log(value);
});

或者

createPromise()
.then((value) => {
    return new Promise.resolve(value);
})
.then((value) => {
    console.log(value);
});

答案 2 :(得分:1)

.then总是返回一个Promise,它解析为函数回调中返回的值。由于您在第一次调用.then时未返回任何内容,undefined将成为已返回的Promise的已解析值。

换句话说,如果您想在第二次调用true时解决.then,则必须在第一次调用中将其返回,如此,

createPromise() // returns a Promise
  .then(function (value) {
    console.log(value); // => true
    return value; // now this will return a Promise that resolves the value `true`
  }).then(function (value) {
    console.log(value) // => true
  });

如果您需要更多信息,可以参考MDN's documentation on method chaining获取ES2015承诺。