2017-01-09 3 views
1

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

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 
    }); 
+0

Вы не возвращаете ничего для прикованного '.then()' для использования в качестве значения. – Jecoms

ответ

4

Каждый 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 
 
    });

2

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

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

Или

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

.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's documentation on method chaining для ES2015 обещаний если вам нужна дополнительная информация.

Смежные вопросы