假設一個商業場景:
透過rss地址,取得rss並儲存於文件,rss地址保存於文件中。
完成該場景的業務需要完成3個任務:
1.從檔案讀取rss位址。
2.取得rss。
3.儲存於文件。
最後將這三個任務整合。
準備:
存放rss地址的文件,address.txt。
http://programmer.csdn.net/rss_programmer.html
任務1:
讀取rss位址檔案的內容並透過callback回傳。
var getRssAddress = function(path, callback) {
fs.readFile(path, {encoding: 'utf8'}, function (err, data) {
callback(err, data);
});
}
任務2:
透過rss位址get到rss,並透過callback回傳錯誤或資料。
var getRss = function(url, callback) {
var data = '';
http.get(url, function(res) {
res.on('data', function(chrunk) {
data = chrunk;
});
res.on('end', function() {
callback(null, data);
});
}).on('error', function(err) {
callback(err, null);
});
}
任務3:
將rss儲存於檔案並透過callback回傳錯誤。
var saveRss = function(data, callback) {
fs.writeFile('rss.txt', data, 'utf8', function(err) {
callback(err);
});
}
整合:
getRssAddress('address.txt', function(err, data) {
if(err) {
console.log(err);
return;
}
getRss(data, function(err, data) {
if(err) {
console.log(err);
return;
}
saveRss(data, function(err) {
if(err) console.log(err);
});
});
});
上面的程式碼是全非同步處理,使用最常見的callback處理非同步邏輯的返回,好處是標準寫法,大家都能容易接受;壞處是耦合性太強,處理異常麻煩,程式碼不直觀,特別是處理業務邏輯複雜和處理任務多的場景,層層的callback會讓人眼冒金星,程式碼難以維護。
Promise/A規範的實作之一when.js正是針對這樣的問題域。
讓我們來看看改造後的程式碼。
任務1:
var getRssAddress = function(path) {
var deferred = when.defer();
fs.readFile(path, {encoding: 'utf8'}, function (err, data) {
if (err) deferred.reject(err);
deferred.resolve(data);
});
return deferred.promise;
}
任務2:
var getRss = 函數(url) {
var deferred = when.defer();
var data = '';
http.get(url, 函數(res) {
res.on('data', function(chrunk) {
資料 = 區塊;
});
res.on('end', function() {
deferred.resolve(資料);
});
}).on('錯誤', 函數(err) {
deferred.reject(err);
});
返回 deferred.promise;
}
任務3:
var saveRss = 函數(data) {
var deferred = when.defer();
fs.writeFile('rss.txt', data, 'utf8', function(err) {
if(err) deferred.reject(err);
deferred.resolve();
});
回 deferred.promise;
}
整合:
getRssAddress('address.txt')
.then(getRss)
.then(saveRss)
.catch(函數(錯誤) {
console.log(錯誤);
});
解釋:
promise/A規範定義的「Deferred/Promise」模型就是「發布/訂閱者」模型,透過Deferred物件發布事件,可以是完成resolve事件,或是失敗reject事件;透過Promise物件回覆完成或失敗的訂閱。
在Promises/A規格中,每個任務都有透明狀態:預設(pending)、完成(fulfilled)、失敗(rejected)。
1.預設狀態可以單向轉移到完成,這個過程叫做resolve,對應的方法是deferred.resolve(promiseOrValue);
2.預設狀態還可以單向轉移到失敗,這個過程叫做reject,對應的方法是deferred.reject(reason);
3.狀態預設時,也可以透過deferred.notify(update)來宣告任務執行訊息,如執行進度;
4.狀態的轉移是瞬時的,一旦任務由初始的pending轉為其他狀態,就會進入到下一個任務的執行過程中。
按照上面的程式碼。
透過when.defer定義一個deferred物件。
var deferred = when.defer();
非同步資料獲取成功後,發布一個完成事件。
deferred.resolve(數據);
非同步資料獲取失敗後,發布一個失敗事件。
deferred.reject(err);
並返回Promise物件作為訂閱使用。
返回 deferred.promise;
訂閱是透過Promise物件的then方法進行完成/失敗/通知的訂閱。
getRssAddress('address.txt')
.then(getRss)
那麼有三個參數,分別是onFulfilled、onRejected、onProgress
promise.then(onFulfilled, onRejected, onProgress)
上一個任務被resolve(data),onFulfilled函數就會被觸發,data作為它的參數。
上一個任務被拒絕(原因),那麼onRejected就會被觸發,收到原因。
任何時候,onFulfilled和onRejected都只有其中一個可以被觸發,並且只觸發一次。
對於處理異常,when.js也提供了極為方便的方法,然後可以提交錯誤,多個任務串列執行時,我們可以只在最後一個then定義onRejected。也可以在最後一個then的後面呼叫catch函數捕捉任何一個任務的異常。
這樣寫法就簡單明了。
getRssAddress('address.txt')
.then(getRss)
.then(saveRss)
.catch(函數(錯誤) {
console.log(錯誤);
});
Promise 為非同步程式設計帶來了巨大的方便,可以讓我們專注於單一任務的實現而不是瀑布金字塔厄運,除了以上程式碼的基本使用,when.js 提供的功能顯然不止本文提到的這些,具體參考官方API。

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3漢化版
中文版,非常好用

WebStorm Mac版
好用的JavaScript開發工具

Dreamweaver Mac版
視覺化網頁開發工具