1. 程式人生 > >NodeJS 非同步 async / await 方案

NodeJS 非同步 async / await 方案

第一個例子

Async/Await應該是目前最簡單的非同步方案了,首先來看個例子。

這裡我們要實現一個暫停功能,輸入N毫秒,則停頓N毫秒後才繼續往下執行。

var sleep =function(time){returnnewPromise(function(resolve, reject){
        setTimeout(function(){
            resolve();}, time);})};var start = async function(){// 在這裡使用起來就像同步程式碼那樣直觀
    console.log('start');
    await sleep
(3000); console.log('end');}; start();

控制檯先輸出start,稍等3秒後,輸出了end

基本規則

  1. async 表示這是一個async函式await只能用在這個函式裡面

  2. await 表示在這裡等待promise返回結果了,再繼續執行。

  3. await 後面跟著的應該是一個promise物件(當然,其他返回值也沒關係,只是會立即執行,不過那樣就沒有意義了…)

獲得返回值

await等待的雖然是promise物件,但不必寫.then(..),直接可以得到返回值。

var sleep =function(time){returnnewPromise(function(resolve
, reject){ setTimeout(function(){// 返回 ‘ok’ resolve('ok');}, time);})};var start = async function(){ let result = await sleep(3000); console.log(result);// 收到 ‘ok’};

捕捉錯誤

既然.then(..)不用寫了,那麼.catch(..)也不用寫,可以直接用標準的try catch語法捕捉錯誤。

var sleep =function(time){returnnewPromise(function(resolve
, reject){ setTimeout(function(){// 模擬出錯了,返回 ‘error’ reject('error');}, time);})};var start = async function(){try{ console.log('start'); await sleep(3000);// 這裡得到了一個返回錯誤// 所以以下程式碼不會被執行了 console.log('end');}catch(err){ console.log(err);// 這裡捕捉到錯誤 `error`}};

迴圈多個await

await看起來就像是同步程式碼,所以可以理所當然的寫在for迴圈裡,不必擔心以往需要閉包才能解決的問題。

..省略以上程式碼var start = async function(){for(var i =1; i <=10; i++){
        console.log(`當前是第${i}次等待..`);
        await sleep(1000);}};

值得注意的是,await必須在async函式的上下文中的。

..省略以上程式碼

let 一到十=[1,2,3,4,5,6,7,8,9,10];// 錯誤示範一到十.forEach(function(v){
    console.log(`當前是第${v}次等待..`);
    await sleep(1000);// 錯誤!! await只能在async函式中執行});// 正確示範for(var v of 一到十){
    console.log(`當前是第${v}次等待..`);
    await sleep(1000);// 正確, for迴圈的上下文還在async函式中}

///////////////////////////////////////////////////////////////

NodeJS + ExpressJS + SequelizeJS使用async wait

router.get('/today',asyncfunction(req,res,next){letchanges=models.prices.findAll({ order: [ ['createdAt','DESC'] ], limit:10, where:Sequelize.where(Sequelize.fn('DATE',Sequelize.col('createdAt')),Sequelize.literal('CURRENT_DATE'))});/* Get price difference per sourceId & productId */for (leti=0;i<changes.length;i++) {letdifference=awaitmodels.prices.findOne({ where:{ productId:changes[i].productId, sourceId:changes[i].sourceId}, order: [ ['createdAt','DESC'] ], limit:1, offset:1});/* Add price difference to array */changes[i]['difference'] = (changes[i].price-difference.price).toFixed(2);}/* RETURN updated changes array here? */res.render('today',{ changes:changes});});補充幾點使用注意事項:await 不能用於forEach 迴圈中,因為forEach 迴圈中的回撥函式是同步的,不能使用async 修飾
Array.forEach(function(){})這種情況可換成等價的 for迴圈即可
for(d of array){}
或者直接使用 new Promise 代替await 方式進行非同步操作

相關推薦

NodeJS 非同步 async / await 方案

第一個例子Async/Await應該是目前最簡單的非同步方案了,首先來看個例子。這裡我們要實現一個暫停功能,輸入N毫秒,則停頓N毫秒後才繼續往下執行。var sleep =function(time){returnnewPromise(function(resolve, r

Js處理非同步async/await

async 首先async內部實現原理就是Promise 將返回一個Promise物件,所以獲取async的返回值需使用.then方法  當async內部丟擲異常狀態, Promise 物件變為reject狀態,使用catch 方法進行捕獲 async函式在執行過程中

微信小程式相容 async / await 方案

要使用 ES7 的 async / await 的話,只靠微信開發者工具中的 Babel 轉換工具是不夠的,它還需要額外的 Babel 外掛來編譯 async / await 程式碼,這裡我們可以做如下配置。 配置步驟如下: 1. 引入 regenerator 包 在自

nodejs通過async/await來操作MySQL

ejs nodejs mys 讀取數據 sync ans com 得到 await 在nodejs中從數據庫得到數據後是通過回調函數來操作數據的,如果嵌套多層將非常可怕,代碼邏輯和可讀性將變得非常差。有時用promise也並不能很好得解決問題,因為如果用了promise後,

js async await 終極非同步解決方案

既然有了promise 為什麼還要有async await ? 當然是promise 也不是完美的非同步解決方案,而 async await 的寫法看起來更加簡單且容易理解。 回顧 Promise Promise 物件用於表示一個非同步操作的最終狀態(完成或失敗),以及其返回的值。 Promise 物件

js async await 終極非同步解決方案

回顧 Promise Promise 物件用於表示一個非同步操作的最終狀態(完成或失敗),以及其返回的值。 Promise 物件是由關鍵字 new 及其建構函式來建立的。建構函式會,把一個叫做“處理器函式”(executor function)的函式作為它的引數。這個“處

Promise原理講解 async+await應用(非同步回撥解決方案

1.非同步程式設計 在JavaScript的世界中,所有程式碼都是單線執行的。 由於這個“缺陷”,導致JavaScript的所有網路操作,瀏覽器事件,都必須是非同步執行。非同步執行可以用: 回撥函式 釋出訂閱 觀察者模式 promise 1.1.回撥函式 function call(id, c

終極非同步解決方案asyncawait以及非同步併發處理方案

前端js的傳統非同步解決方案及時回撥,but我們親愛的es6新增了三種解決方案: Promise Generator - async 之前專案中一直是用promise來解決,vue專案中的axios其實也是返回的Promise物件,async其實

「大概可能也許是」目前最好的 JavaScript 非同步方案 async/await

構建一個應用程式總是會面對非同步呼叫,不論是在 Web 前端介面,還是 Node.js 服務端都是如此,JavaScript 裡面處理非同步呼叫一直是非常噁心的一件事情。以前只能通過回撥函式,後來漸漸又演化出來很多方案,最後 Promise 以簡單、易用、相容性好取勝,但

NodeJS-Promise、awaitasync非同步變同步

由於公司需要,部分JAVA_WEB介面開發改為NodeJS。 NodeJS與JAVA相比起來較為輕量級,非同步請求呼叫。 總的來說,適用於做微服務。在使用NodeJS的非同步呼叫同時,難免會遇到需要同步的時候。 不說多了,上程式碼 非同步程式碼 const request

async/await工作機制探究--NodeJS

span 結果 函數 class fir RR rim require first ES6中的async/await讓Promise變得更加簡便,通常await處理的鏈式Promise會包裹在函數中,返回結果仍然是一個Promise對象。 但是當await直接處理鏈式Pro

非同步方法 async/await

不用非同步的示例: static void Main(string[] args) { Watch.Start(); string Url1 = "Http://www.tmall.com"; string Url

[C#] .NET4.0中使用4.5中的 async/await 功能實現非同步

在.NET Framework 4.5中添加了新的非同步操作庫,但是在.NET Framework 4.0中卻無法使用。這時不免面臨著抉擇,到底是升級整個解決方案還是不使用呢?如果你的軟體還沒釋出出去,建議直接使用.NET Framework 4.5吧;但是如果已經發布了,又不想使用者重新升級框架到.NET

「前端進階」完全吃透async/await,深入JavaScript非同步

完全吃透async/await 導論: 首先,必須瞭解Promise 主要研究基本語法 對比Promise與Async 異常處理 參考: Async +Await 理解 as

非同步程式設計Async/Await中的最佳做法

近日來,湧現了許多關於 Microsoft .NET Framework 4.5 中新增了對 async 和 await 支援的資訊。 本文旨在作為學習非同步程式設計的“第二步”;我假設您已閱讀過有關這一方面的至少一篇介紹性文章。 本文不提供任何新內容,Stack Overflo

async/await來處理非同步

async function hello(){ return 'hello world'; } await 可以理解為是 async wait 的簡寫。await 必須出現在 async 函式內部,不能單獨使用。 async function awaitDemo() { aw

非同步程式設計的 async/await

async/await 和 Generators + co 的寫法非常的相似,只是把用於宣告 Generator 函式的 * 關鍵字替換成了 async 並寫在了 function 關鍵字的前面,把 yield 關鍵字替換成了 await;另外,async 函式是基於 Promise 的

C# async/await非同步變成深入理解

非同步函式簡介 一般指 async 修飾符宣告得、可包含await表示式得方法或匿名函式。   宣告方式 非同步方法的宣告語法與其他方法完全一樣, 只是需要包含 async 關鍵字。async可以出現在返回值之前的任何位置, 如下示例: async public st

async/await 非同步

async/await 是一個用同步的思維來解決非同步問題的方案。 async 函式就是 Generator 函式的語法糖。 async 函式的優點 async寫在function前面,該函式返回值是一個promise,可以直接使用then方法。 async functio

vue:非同步async and await與this.nextTick()的使用

專案例子: async focusInput (index) { await this.$nextTick(() => { let el = this.$refs[`scopeInput-${index}`].$el let input = el.querySe