我对JavaScript有点陌生,我不知道为什么以下代码的打印顺序是Noam,然后是Amit,只有它们。 有人可以澄清吗?
function rc(){
console.log('Assaf');
}
function thenCall(){
console.log('Amit');
}
function myPromise(){
return Promise.resolve(function(){
console.log('Yarden');
rc();
});
}
myPromise().then(function(){thenCall()});
console.log('Noam');
答案 0 :(得分:2)
Promise.resolve
得到的结果被传递到then
中。它不调用该函数。注意对.then
的回调。
function rc(){
console.log('Assaf');
}
function thenCall(){
console.log('Amit');
}
function myPromise(){
return Promise.resolve(function(){
console.log('Yarden');
rc();
});
}
myPromise().then(function(fn){
console.log(fn); // notice
thenCall()
});
console.log('Noam');
答案 1 :(得分:1)
应该执行Promise.resolve内部的函数,因为它将等待结果返回:
function rc(){
console.log('Assaf');
}
function thenCall(){
console.log('Amit');
}
function myPromise(){
return Promise.resolve(function(){
console.log('Yarden');
rc();
}());
}
myPromise().then(function(){thenCall()});
console.log('Noam');
答案 2 :(得分:1)
让问题除以您尝试登录的人
首先打印Noam,因为代码中没有异步过程。您确实使用了Promise,但是它会立即执行resolve方法。
调用Promise.resolve
时,将执行.then
方法中的函数。因此,Amit可以在控制台中正确打印。
Promise.resolve
立即解决新的Promise并因此立即调用.then
方法。赋予Promise.resolve
的参数是将作为参数传递给.then
方法的值。
要创建一个基于某些逻辑解决或拒绝的实际承诺,这应该使您入门:
var a = true;
function myPromise() {
return new Promise(function (resolve, reject) {
console.log('first');
if (a) {
return setTimeout(function () {
resolve('value_to_pass_to_then');
}, 1000);
}
return reject('value_to_pass_to_catch');
});
}
myPromise()
.then(function (val) { console.log('second'); })
.catch(function (val) {})
答案 3 :(得分:0)
Yarden
函数是myPromise()
返回的promise解析的函数。但是您没有使用resolve值做任何事情:
myPromise().then(function(/* resolve value would go here */){thenCall()});
promise解析的值是传递给.then
的函数的 first 参数。但是您在那里没有争论。如果要运行该函数,则必须将其用作参数,然后显式调用它(这将依次调用打印Assaf
的函数):
function rc() {
console.log('Assaf');
}
function thenCall() {
console.log('Amit');
}
function myPromise() {
return Promise.resolve(function() {
console.log('Yarden');
rc();
});
}
myPromise().then(function(yardenFn) {
thenCall();
yardenFn();
});
console.log('Noam');