簡體   English   中英

從另一個承諾的當時返回一個承諾

[英]returning a promise from the then of another promise

我對此有些新意。 請幫忙

我試圖從一個函數返回一個承諾。 直到我嘗試在現有諾言中退還諾言之前,這似乎一直很好。

我正在嘗試在FireFox擴展中執行此操作。 下面的代碼是為node.js編寫的,因為我認為它可能會提供更多解釋。 我不知道如何使它工作。

函數topLevel調用函數level2。 level2等待一個諾言解決,然后將諾言返回給level1。 level1登錄其.then。

在內部承諾得到解決后,level2調用level3並返回新的promise

在該示例中,所有承諾都會立即解決。 該示例與基本要素配對

function topLevel() {
  level2()
  .then(() => {
      console.log("topLevel resolved")
    })
}

let testError=true;

function level2() {
  if(testError) {
    new Promise((resolve, reject) => {
      resolve("Level 2");
    })
      .then(() => {
        return (level3());
      })
  }
  else {
    return (level3());
  }
}


function level3(){
  return (new Promise((resolve, reject) => {
    resolve("Level 3");
  }));


}


topLevel();

有一個變量“ testError”可以更改級別2的行為。當設置為“ true”時,級別2等待一個諾言,並從該諾言then語句中返回級別3的諾言。 level3已運行,但level1中的console.log從不執行,並導致錯誤。 設置為false時,一切正常(來自level3的承諾將直接返回,而不是在.then中返回。錯誤是無法讀取頂級.then中未定義的屬性'then'。

下面是來自后台腳本的firefox webextension代碼

browser.browserAction.onClicked.addListener(topLevel);


function topLevel() {
  level2()
  .then(() => {
      console.log("topLevel resolved")
    })
}


function level2() {
  new Promise((resolve, reject) => {
    resolve("Level 2");
  })
    .then(() => {
      return (level3());
    })
}


function level3(){

  return (new Promise((resolve, reject) => {
    resolve("Level 3");
  }));


}

它在.then和return語句之間的level2中引起警告“ level2 is undefined”。 再次登錄一級永遠不會發生。

有什么辦法可以使這項工作? 我需要依靠這種模式

testError為true時, level2不返回任何內容。

thenable( then賦予的功能)是一個功能。 thenable內部的return語句僅涉及thenable本身(就像任何函數一樣)。

改成

function level2() {
  if (testError) {
    return new Promise((resolve, reject) => {
      resolve("Level 2");
    }).then(() => {
      return level3();
    });
  }
  return level3();
}

我認為這就像在第12行中的new Promise...之前添加return一樣簡單。修改后的代碼:

function topLevel() {
  level2()
  .then(() => {
    console.log("topLevel resolved")
  })
}

let testError = true;

function level2() {
  if(testError) {
    // Added "return" here
    return new Promise((resolve, reject) => {
      resolve("Level 2");
    })
    .then(() => {
      return (level3());
    })
  }
  else {
    return (level3());
  }
}

function level3() {
  return (new Promise((resolve, reject) => {
    resolve("Level 3");
  }));
}

您需要returnlevel2函數中創建的new Promise

暫無
暫無

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

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