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

Max*_*x K 2 javascript callback promise ecmascript-6 es6-promise

如果你想在JavaScript中调用回调后执行代码,那么你可以在回调之后放置它:

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

demoCallback(() => {
  console.log("I execute first")
})
Run Code Online (Sandbox Code Playgroud)

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

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

demoPromise().then(() => { console.log("I execute second") })
Run Code Online (Sandbox Code Playgroud)

后插入的代码决心执行一次许是解决了,但之前 称为函数的范围之外.有没有办法可以在两者之后执行代码,但是在函数范围内这样做?

Ber*_*rgi 5

是否可以在函数范围内使用ES6 Promise做同样的事情?

不,这是不可能的.then回调总是异步运行,包括与resolve()调用异步.

(也就是说,承诺回调排队,所以你可以滥用那个队列让你的代码落后于另一个:

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
Run Code Online (Sandbox Code Playgroud)

但请不要这样做)

如果要在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");
});
Run Code Online (Sandbox Code Playgroud)

这被称为处理器模式,对处理资源非常有用.