2017-10-28 32 views
-1

我想了解承諾和承諾鏈接。根據我的理解,以下代碼必須打印'hello!'到控制檯。但是,事實並非如此。 任何人都可以解釋爲什麼會發生這種情況,以及正確的方法是什麼?爲什麼不是'Promise Chaining'工作?

function func01() { 
 
    console.log('func01'); 
 
    return new Promise(function(){ 
 
     console.log('promise'); 
 
     setTimeout(function(){ 
 
      console.log('st'); 
 
      return 'hello !' 
 
     },5000); 
 
    }).then(function(data){ 
 
     console.log('then01'); 
 
     return data; 
 
    }); 
 
} 
 
function func02() { 
 
    console.log('func02'); 
 
    return func01().then(function(data){ 
 
     console.log('then02'); 
 
     return data; 
 
    }) 
 
} 
 
function func03() { 
 
    console.log('func03'); 
 
    func02().then(function(data){ 
 
     console.log('then03'); 
 
     console.log(data); 
 
    }); 
 
} 
 
func03();

+7

提示:通過'setTimeout'調用的函數的返回值被忽略。您需要使用'Promise'構造函數提供的參數('resolve,reject')並調用'resolve'。 – jcaron

+3

也許讀一些關於如何創造承諾將是一個好的開始。問題應該證明你已經研究過這個話題。 – trincot

回答

1

無極應該resolve到的東西它要傳遞到呢。 setTimeout是一個異步調用,該函數的返回值將不被考慮(Per @ jcaron)。結合這些,在這裏你去:

function func01() { 
 
     console.log('func01'); 
 
     return new Promise(function(resolve, reject){ 
 
      console.log('promise'); 
 
      resolve('hello !') 
 
     }).then(function(data){ 
 
      console.log('then01'); 
 
      return data; 
 
     }); 
 
    } 
 
    function func02() { 
 
     console.log('func02'); 
 
     return func01().then(function(data){ 
 
      console.log('then02'); 
 
      return data; 
 
     }) 
 
    } 
 
    function func03() { 
 
     console.log('func03'); 
 
     func02().then(function(data){ 
 
      console.log('then03'); 
 
      console.log(data); 
 
     }); 
 
    } 
 
    func03();