簡體   English   中英

解決承諾數據

[英]Resolving promise data

考慮以下代碼片段,

function one(){
    var prm = new Promise(function(resolve,reject){
        resolve("one");
    });
    prm.customKey = function(){
    }
    return prm;
}
function two(){
    var prm = one();
    prm.then(function(res){
        return "two";
    });
    return prm;
}
function three(){
    return one().then(function(res){
        return "two";
    });
}

我希望下面的兩個控制台將res控制台表示為“ two”(解決“ two”)。

但奇怪的是,i)控制台res為“一個”,ii)控制台res為“兩個”

i) two().then(function(res){
       console.log(res);
   });

ii) three().then(function(res){
       console.log(res);
    });

有人可以解釋為什么它會這樣。

因為您返回PRM。 那是一個承諾,會回報一個。 返回語句為“ two”的地方,此return語句用於它所調用的函數,這意味着.then語句中的回調。

它不會影響承諾本身。 您只是在two()方法中使用了一個promise(來自one()),並按原樣返回了它。

在第二個和第三個函數中,您還應該返回等待另一個Promise並解決其響應的新Promise ,如下所示:

function two(){
   return new Promise((resolve,reject) => {
      one().then(() => resolve("two"));
   });
}

兩個作用,PRM變量實際上並沒有當它是由函數返回的更新。

在這行之后直接var prm = one();

跳轉到該行return prm;

因為它不希望現在從諾言中獲得數據。

但是,在其他三個函數中,您將返回promise,因此結果如您所願彈出。

要使兩個獲得與三個相同的結果,請添加async和await

async function two(){
    var prm = one();
    await prm.then(function(res){
        prm = "two";
    });
    return prm;
}

嘗試修改此功能:

function two(){
  var prm = one();
  prm.then(function(res){
    return "two";
 });
}

暫無
暫無

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

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