ES6 Javascript Promise-在.then()被调用之后执行

时间:2018-07-23 14:16:40

标签: javascript ecmascript-6 callback promise es6-promise

如果要在JavaScript中调用回调后执行代码,则可以将其放在回调之后:

function demoCallback(callback) {
  callback()
  console.log("I execute second")
}

demoCallback(() => {
  console.log("I execute first")
})

在功能范围内是否可以对ES6 Promise做同样的事情?假设我有一个返回Promise的函数:

function demoPromise() {
  return new Promise((resolve, reject) => {
    resolve()
    console.log("I execute first")
  })
}

demoPromise().then(() => { console.log("I execute second") })

解决之后插入的代码将在Promise解决后执行,但是在之前 然后被调用,但超出了函数范围。 是否有一种方法可以同时执行两次代码,但是可以在函数范围内执行代码?

2 个答案:

答案 0 :(得分:5)

  

是否可以在功能范围内对ES6 Promise做同样的事情?

否,这是不可能的。 then回调总是异步运行的,其中包括与resolve()调用有关的异步。

(也就是说,promise回调已排队,因此您可以滥用该队列以使代码落后于另一个:

function demoPromise() {
  const p = new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
      p.then(() => {
        console.log("I execute second");
      }); // because I will be scheduled second
    }, 1000);
  });
  return p;
}

demoPromise().then(() => {
   console.log("I execute first");
}); // because I was scheduled first

但是请不要那样做

  

如果要在JavaScript中调用回调后执行代码

那么您可能不应该仅仅返回承诺。执行代码之前,请执行一个所需的回调:

function demoPromise(callback) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, 1000);
  }).then(() => {
    return callback();
  }).then(res => {
    console.log("I execute second");
  });
}

demoPromise(() => {
   console.log("I execute first");
}).then(() => {
   console.log("I execute last");
});

这被称为disposer pattern,对于处理资源非常有用。

答案 1 :(得分:1)

您可以使用 then 块中调用的函数来解决Promise。只要在该块中调用该函数,就可以像这样

function demoPromise() {
  return new Promise((resolve, reject) => {
    resolve(function(){
        console.log("I execute second")
    });
  })
}

demoPromise().then(f => { console.log("I execute first");f();})