2017-01-30 175 views
-1

怎麼在我的.then()printer.done()不顯示我的消息?。然後()與承諾訂購

printer.done()應該顯示一個消息模板。

.then(() => { 
    const whileHeapList =() => { 
     setTimeout(() => { 
      console.log(new Date()); 
      console.log(1); 
      setTimeout(() => { 
       console.log(2); 
       console.log(new Date()); 
      }, 5000) 
     }, 5000); 
    }; 
    whileHeapList(); 
    }).then(() => { 
     printer.done() 
    }); 

我想我的代碼做的是日誌1,等待5秒鐘登錄2,然後打印出printer.done()模板消息什麼

眼下是這樣的輸出:

** TEMPLATE ** 

2017-01-30T04:19:54.111Z 
1 
2 
2017-01-30T04:19:59.118Z 
+2

你的代碼在上面'.then'沒有按」 t返回一個等待的承諾,因此,'printer.done'將立即執行 –

+0

@JaromandaX如果我有'返回新的Promise(whileHeapList)'而不是'whileHeapList()'我得到1,2和時間日誌,但該模板不顯示 – Liondancer

回答

1

如果你希望第二個.then等待第二個setTimeout完成,你需要返回第一個.then的承諾,該第一個承諾解決第二個setTimeout觸發

.then(function() { 
    var whileHeapList = function whileHeapList() { 
     return new Promise(function(resolve) { // added 
      setTimeout(function() { 
       console.log(new Date()); 
       console.log(1); 
       setTimeout(function() { 
        console.log(2); 
        console.log(new Date()); 
        resolve(); // added 
       }, 5000); 
      }, 5000); 
     }); // added 
    }; 
    return whileHeapList(); // added a return 
}).then(function() { 
    printer.done(); 
}); 

,或者使用侑評論未遂代碼

.then(function() { 
    var whileHeapList = function whileHeapList(resolve) { 
     setTimeout(function() { 
      console.log(new Date()); 
      console.log(1); 
      setTimeout(function() { 
       console.log(2); 
       console.log(new Date()); 
       resolve(); // added 
      }, 5000); 
     }, 5000); 
    }; 
    return new Promise(whileHeapList); 
}).then(function() { 
    printer.done(); 
}); 
+0

我試過這個,但模板首先被打印,然後剩下的。我試圖首先打印1,2'和Date(),然後是模板。不知道爲什麼會發生= /。我認爲最後一個'.then()'只有在'.then()'完成之前纔會執行' – Liondancer

+0

這段代碼將會記錄1,2,然後纔會執行'printer.done()'...確保你不會在代碼中使用**每個返回** - 問題可能存在,因爲你發佈的代碼與你實際使用的代碼有很大的不同 - 因爲代碼中的嵌套超時沒有任何用處......如果你想要然後在之前的「.then」中「等待」一些異步代碼,你必須返回一個Promise來解析異步完成 –

0

我會做一個睡眠功能和鏈然後

const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)); 

...  

.then(() => sleep(5000)) 
.then(() => console.log(1, new Date())) 
.then(() => sleep(5000)) 
.then(() => console.log(2, new Date())) 
.then(() => printer.done())