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
。
基本規則
async 表示
這是一個async函式
,await只能用在這個函式裡面
。await 表示在這裡
等待promise返回結果
了,再繼續執行。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
終極非同步解決方案async,await以及非同步併發處理方案
前端js的傳統非同步解決方案及時回撥,but我們親愛的es6新增了三種解決方案: Promise Generator - async 之前專案中一直是用promise來解決,vue專案中的axios其實也是返回的Promise物件,async其實
「大概可能也許是」目前最好的 JavaScript 非同步方案 async/await
構建一個應用程式總是會面對非同步呼叫,不論是在 Web 前端介面,還是 Node.js 服務端都是如此,JavaScript 裡面處理非同步呼叫一直是非常噁心的一件事情。以前只能通過回撥函式,後來漸漸又演化出來很多方案,最後 Promise 以簡單、易用、相容性好取勝,但
NodeJS-Promise、await、async非同步變同步
由於公司需要,部分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