2017-12-12 10 views
0

私は約束を学んでおり、次のコードを使用して連鎖しようとしています。この中で、.then()は、最初の実行されます:あなたが見ることができるように、したがって、値が返されていない前に、.then()が呼び出される。()がPromise.all()の前に実行されています

Promise 2 
This will print as second line after the method name, even though its the last line. 
Yay! ,,, 
This should be before 'Yay!' for i= 1 
This should be before 'Yay!' for i= 2 
This should be before 'Yay!' for i= 3 
This should be before 'Yay!' for i= 4 
This should be Awesome: Awesome! 

Process finished with exit code 0 

function myPromise1() 
{ 
    console.log("Promise", 1); 
    return Promise.all([ 
    new Promise((resolve, reject) => { 
     setTimeout(() => { 
     console.log("This should be before 'Yay!' for 1"); 
     resolve(1); 
     }, 3000); 
    }), 
    new Promise((resolve, reject) => { 
     setTimeout(() => { 
     console.log("This should be before 'Yay!' for 2"); 
     resolve(2); 
     }, 3000); 
    }) 
    ]); 
} 

function myPromise2() { 
    console.log("Promise", 2); 
    var arr = [1,2,3,4]; 
    return Promise.all(arr.map(i => { 
    new Promise((resolve, reject) => { 
     setTimeout(() => { 
     console.log("This should be before 'Yay!' for i= " + i); 
     resolve("Success!" + i); 
     }, 3000) 
    }) 
    })); 
} 

function anotherPromise(val) { 
    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     resolve(val); 
    }, 3000); 
    }); 
} 

myPromise2() 
    .then((msg) => { 
    console.log("Yay! " + msg); 
    return anotherPromise("Awesome!"); 
}) 
    .then((msg2) => { 
    console.log("This should be Awesome:", msg2); 
}) 
    .catch((err) => { 
    console.log("Uh no, this is a lie --->", err); 
}); 

console.log("This will print as second line after the method name, even though its the last line."); 

これが出力されます。

しかし、代わりにmyPromise1()を呼び出すと、希望の出力が得られます。値も返され、両方の約束の後に.then()が呼び出されます。

myPromise2()で問題を解決するにはどうすればよいですか?あなたがここにmapメソッドから戻るために忘れている

答えて

3

Promise.allにつながる、

function myPromise2() { 
    console.log("Promise", 2); 
    var arr = [1,2,3,4]; 
    return Promise.all(arr.map(i => { 
    /* missing return ---> */ new Promise((resolve, reject) => { 
     setTimeout(() => { 
     console.log("This should be before 'Yay!' for i= " + i); 
     resolve("Success!" + i); 
     }, 3000) 
    }) 
    })); 
} 

function myPromise1() { 
 
    console.log("Promise", 1); 
 
    return Promise.all([ 
 
    new Promise((resolve, reject) => { 
 
     setTimeout(() => { 
 
     console.log("This should be before 'Yay!' for 1"); 
 
     resolve(1); 
 
     }, 3000); 
 
    }), 
 
    new Promise((resolve, reject) => { 
 
     setTimeout(() => { 
 
     console.log("This should be before 'Yay!' for 2"); 
 
     resolve(2); 
 
     }, 3000); 
 
    }) 
 
    ]); 
 
} 
 

 
function myPromise2() { 
 
    console.log("Promise", 2); 
 
    var arr = [1, 2, 3, 4]; 
 
    return Promise.all(arr.map(i => { 
 
    return new Promise((resolve, reject) => { 
 
     setTimeout(() => { 
 
     console.log("This should be before 'Yay!' for i= " + i); 
 
     resolve("Success!" + i); 
 
     }, 3000) 
 
    }) 
 
    })); 
 
} 
 

 
function anotherPromise(val) { 
 
    return new Promise((resolve, reject) => { 
 
    setTimeout(() => { 
 
     resolve(val); 
 
    }, 3000); 
 
    }); 
 
} 
 

 
myPromise2() 
 
    .then((msg) => { 
 
    console.log("Yay! " + msg); 
 
    return anotherPromise("Awesome!"); 
 
    }) 
 
    .then((msg2) => { 
 
    console.log("This should be Awesome:", msg2); 
 
    }) 
 
    .catch((err) => { 
 
    console.log("Uh no, this is a lie --->", err); 
 
    }); 
 

 
console.log("This will print as second line after the method name, even though its the last line.");

+0

くそーを、1秒で私を倒します! +1 – Carson

+2

私はちょうど私のコーヒーを終えたからです:P – codtex

+1

ありがとう、それはそんなに愚かな間違いだったとは信じられません。私は今でも私にコーヒーを作る必要がある。 –

1

はあなたがあなたのmapコールバックからreturnに約束を忘れては配列と呼ばれています4 undefined s:

function myPromise2() { 
    console.log("Promise", 2); 
    var arr = [1,2,3,4]; 
    return Promise.all(arr.map(i => { 
    return new Promise((resolve, reject) => { 
// ^^^^^^ 
     setTimeout(() => { 
     console.log("This should be before 'Yay!' for i= " + i); 
     resolve("Success!" + i); 
     }, 3000) 
    }) 
    })); 
} 

また、括弧を削除して暗黙的に表現返し簡潔なボディメイク:

function myPromise2() { 
    console.log("Promise", 2); 
    var arr = [1,2,3,4]; 
    return Promise.all(arr.map(i => 
//        ^
    new Promise((resolve, reject) => { 
     setTimeout(() => { 
     console.log("This should be before 'Yay!' for i= " + i); 
     resolve("Success!" + i); 
     }, 3000) 
    }) 
    )); 
//^ 
} 
+0

チップをありがとう! –

関連する問題