2017-04-15 58 views
1

我正在嘗試編寫「現代」js,並避免使用異步/等待的回調和承諾。但是,我不能完全理解它是如何工作的。我認爲「下一個」功能會等到第一個功能在跑完之前完成。異步/等待功能沒有等待。多個函數不運行並按順序完成

在我的應用程序中,四個函數都是對MySQL DB的ajax調用以更新記錄並選擇其他數據並構建一個新的html表格寫入DOM。

這四個函數按隨機順序完成,導致接口不正確。刷新整個頁面可以解決問題,但如果這些功能只按我定義的順序運行並完成,那麼界面將是正確的。

async function reloadAllTable(workOrderId,statusId) { 
    await techSelectTable(workOrderId); 
    await updateWOStatus(workOrderId,statusId); 
    await loadWOScheduled(statusId); 
    await loadWOAssigned(statusId); 
} 

reloadAllTable(workOrderId,statusId); 
+2

您等待*承諾*。這些函數中的任何一個都會返回promise嗎?如果沒有,那是你的問題。 – jib

+0

不是。它們都只是處理數據庫記錄的ajax例程,但這些過程必須按順序進行。 –

+0

你如何期待JS知道他們何時完成?例如, techSelectTable'通常會調用一個傳入的回調函數或者什麼時候完成? – jib

回答

0

我剛剛遇到了這個問題,但是對於發現這個問題的其他人來說,回答遲到總比沒有回答遲。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

異步函數可以包含的await表達式,即暫停異步函數的執行,並等待通過Promise的分辨率,然後恢復異步函數的執行,並返回解析值。

這裏的問題可能是使用異步/等待synxtax,被調用的函數必須返回一個承諾。如果沒有承諾等待解決,那麼執行繼續到下一個語句。如上所述,這些函數不會返回承諾,並且不會按照所需的順序加載。

要按照您指定的順序執行代碼,您需要修改函數以返回承諾。如果AJAX調用返回thenable你可能將它轉換成一個承諾,並等待這一承諾:

Promise.resolve(yourThenable) 

對於隨後節點回調風格的功能,這樣做的一個方式是通過promisify節點模塊(https://www.npmjs.com/package/promisify-node):

var promisify = require("promisify-node"); 

function myCallbackFunction(callback) { 
    callback(null, true); 
} 

// Convert the function to return a Promise. 
var wrap = promisify(myCallbackFunction); 

// Invoke the newly wrapped function. 
wrap().then(function(value) { 
console.log(value === true); 
});