Я думал, что можно было использовать метод .then () при использовании обещаний ES6. Другими словами, я подумал, что при разрешении обещания значение, переданное в функцию разрешения, должно быть передано любым обработчикам цепочек then . Если это так, то почему значение возвращается неопределенным в цепочечном обработчике then ниже?

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
  });
2
david_i_smith 9 Янв 2017 в 23:20

3 ответа

Лучший ответ

Каждый 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
  });
8
Scimonster 9 Янв 2017 в 20:25

.then всегда возвращает Promise, который разрешается в значение, возвращаемое в обратном вызове функции. Поскольку при первом вызове .then вы ничего не возвращаете, undefined становится разрешенным значением возвращаемого обещания.

Другими словами, если вы хотите разрешить 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 по методам. сцепление для ES2015 обещает, если вам нужна дополнительная информация.

1
ughitsaaron 9 Янв 2017 в 21:14

Вы должны вернуть его в обещании передать его. Или создайте новое обещание, которое решается с ним.

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

Или же

createPromise()
.then((value) => {
    return new Promise.resolve(value);
})
.then((value) => {
    console.log(value);
});
2
Andy Ray 9 Янв 2017 в 20:24