簡體   English   中英

ES6 Javascript Promise-在.then()被調用之后執行

[英]ES6 Javascript Promise - execute after .then() is called

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

決心后插入的代碼執行一次許是解決了,但此之前被調用的函數的范圍之外。 有沒有一種方法可以在兩者之后執行代碼,但是可以在函數范圍內執行呢?

在功能范圍內,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");
});

這稱為處理程序模式 ,對於處理資源非常有用。

您可以使用可以在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();}) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM