ES6 Javascript Promise -执行后,则调用()

lhcgjxsq  于 2023-04-28  发布在  Java
关注(0)|答案(3)|浏览(175)

如果你想在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") })

resolve之后插入的Code在Promise解析后执行,但*then之前的Code在函数作用域之外调用。有没有一种方法可以在两个函数之后执行代码,但在函数的作用域内执行?

zpf6vheq

zpf6vheq1#

是否可以在函数的作用域中对ES6 Promise做同样的事情?
不这不可能then回调总是异步运行,这包括与resolve()调用异步。
(That 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中调用回调后执行代码
那么你可能不应该只返回一个promise。在执行代码之前,执行一个回调函数来完成你想做的事情:

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,对于处理资源非常有用。

z9gpfhce

z9gpfhce2#

你可以使用一个可以在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();})
fnx2tebb

fnx2tebb3#

你可以试试下面的方法

demoPromise().then(()=>{
        console.log('I execute first')
    }).then(() =>{
        console.log('I execute second')
    }).catch((err)=>{
        console.error(err)
    }).finally(()=>{
        console.log('I execute last')
    })

相关问题