2017-01-09 6 views
1

ES6の約束を使うときに.then()メソッドを連鎖させることができると考えられました。言い換えれば、私は、約束が解決されると、解決関数に渡される値は、、次にハンドラに渡されるべきだと考えました。これがどうでしょうか、の値は、チェーンので定義されていません。次にハンドラは未定義ですか?ES6の約束で.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 
    }); 
+0

連鎖した '.then()'が値として使用されるために何も返されていません。 – Jecoms

答えて

4

then()then()通話のための解決された値として使用される値を返すことができます。最初のthen()では何も返さないので、次のコールバックではvalueは未定義です。最初のものにはvalueを返し、2番目のもので利用できるようにします。

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常に関数コールバックに返された値に解決の約束を返します。 .thenへの最初の呼び出しで何も返さないので、undefinedが返されたPromiseの解決された値になります。言い換えれば

、あなたが.thenに2回目の呼び出しでtrueを解決したい場合、あなたはそのように、最初にそれを返す必要があるでしょう、

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 
    }); 
あなたはES2015の約束のために MDN's documentation on method chainingを参照することができます

さらに詳しい情報が必要な場合。

関連する問題