承诺行为和印刷顺序

时间:2018-07-08 20:16:45

标签: javascript promise

我对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');

4 个答案:

答案 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

首先打印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');