摘要:使用模擬發(fā)起請求很常用的但是由于模塊原生和第三方庫提供里面的方法都是異步,對于很多場景下應(yīng)用很麻煩,不如同步來的方便。下面總結(jié)了幾個(gè)常見的庫從異步轉(zhuǎn)同步的幾種方法??梢约尤氩东@異常也可以加參數(shù)的用法參考鏈接在異步變同步中不能使用寫法。
使用Node.js模擬發(fā)起http請求很常用的,但是由于Node模塊(原生和第三方庫)提供里面的方法都是異步,對于很多場景下應(yīng)用很麻煩,不如同步來的方便。下面總結(jié)了幾個(gè)常見的庫API從異步轉(zhuǎn)同步的幾種方法。模塊有:request, request-promise , request-promise-native , request-promise-any
PS:Node的版本>=8.0.0 為了使用 Async / Await
PS: 這里加入auth 字段是為了需要用戶名和密碼登錄的應(yīng)用的請求 ,比如rabbitmq ,不需要登錄的頁面可以去掉這個(gè)參數(shù)。
使用原生模塊 util , 利用其 promisify API , 代碼示例如下:
const request = require("request"); const util = require("util"); var url = "https://www.baidu.com/"; const getPromise = util.promisify(request.get); // PS: 這里加入auth 字段是為了需要用戶名和密碼登錄的應(yīng)用的請求 ,比如rabbitmq ,不需要登錄的頁面可以去掉這個(gè)參數(shù)。 //1: 原生寫法 無auth 參數(shù) getPromise(url).then((value)=>{ console.log("value" , value ); }).catch((err)=>{ console.log("err" , err ); }); //2: 原生寫法 有auth 參數(shù) getPromise(url , {"auth" : { "user" : "xx", "pass" : "xx", "sendImmediately" : "false", }}).then((value)=>{ console.log("value" , value ); }).catch((err)=>{ console.log("err" , err ); }); // 第二種寫法 async/await // 個(gè)人最建議使用這種 , 只使用util 和 request 。 async function handle(){ let result = await getPromise(url , {"auth" : { "user" : "xx", "pass" : "xx", "sendImmediately" : "false", }}); // 可以加入 try catch 捕獲異常 也可以加 .catch() console.log("result" , result.); } handle(); PS: `auth` 參數(shù)的用法參考[鏈接][1] , 在異步變同步中 不能使用 `request.get().auth()` 寫法。第二種
使用模塊 request-promise-native , request-promise-native是使用 native Promise 寫的,查看源碼可以看到繼承自 Request 模塊 , 代碼示例如下:
// 不再寫 原生示例 then()鏈的那種,參考第一個(gè)示例即可 //get 請求示例 const rpn = require("request-promise-native"); var url = "https://www.baidu.com/"; async function useRequestPromiseNative(){ // options 里面的參數(shù)可以去看request的源碼 查看其index.d.ts 文件里面的 interface CoreOptions 里面有所有的參數(shù)。 let options = { method: "GET", uri: url, auth : { "user" : "xx", "pass" : "xx", "sendImmediately" : "false", } }; let rpnbody = await rpn(options); console.log("rpnbody" , rpnbody ); } useRequestPromiseNative(); // post 示例 const rpn = require("request-promise-native"); var url = "https://www.baidu.com/"; async function useRequestPromiseNative(){ let options = { method: "POST", uri: url, body: { // 這里定義你的body參數(shù) } json: true, // 這個(gè)看你的參數(shù)而定 }; let rpnbody = await rpn(options); console.log("rpnbody" , rpnbody ); } useRequestPromiseNative();第三種
使用模塊 request-promise , request-promise是基于 bluebird 寫的, 查看源碼可以看到繼承自 Request 模塊 , 代碼示例如下:
// 不再寫post 示例 const rp = require("request-promise"); var url = "https://www.baidu.com/"; async function useRequestPromise(){ let options = { method: "GET", uri: url, auth : { //可以拿掉 "user" : "xx", "pass" : "xx", "sendImmediately" : "false", } }; let rpbody = await rp(options); console.log("rpnbody" , rpbody ); } useRequestPromise();第四種
使用模塊 request-promise-any , request-promise-any也是基于 request 寫的, 代碼示例如下:
// 不再寫post 示例 const rpa = require("request-promise-any"); var url = "https://www.baidu.com/"; async function useRequestPromiseAny(){ let options = { method: "GET", uri: url, auth : { "user" : "xx", "pass" : "xx", "sendImmediately" : "false", } }; let rpabody = await rpa(options); console.log("rpabody" , rpabody ); } useRequestPromiseAny();第五種
使用模塊 bluebird , 利用其 promisifyAll API 轉(zhuǎn)成Promise , 代碼示例如下:
const Promise = require("bluebird"); const request = require("request"); var url = "https://www.baidu.com/"; Promise.promisifyAll(request, { suffix: "SC" }); //suffix 自定義 get --> getSC async function usebluebird(){ let result = await request.getSC(url , {"auth" : { "user" : "xx", "pass" : "xxx", "sendImmediately" : "false", }}); console.log("result" , result); } usebluebird()
上面總結(jié)了5種使用方法,其實(shí)要說也不止5種了,大家根據(jù)自己需要來選擇。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/97767.html
摘要:事件循環(huán)事件循環(huán)是指主線程重復(fù)從消息隊(duì)列中取消息執(zhí)行的過程。事件觸發(fā)時(shí),表示異步任務(wù)完成,會(huì)將事件監(jiān)聽器函數(shù)封裝成一條消息放到消息隊(duì)列中,等待主線程執(zhí)行。 一. 單線程 我們常說JavaScript是單線程的。 所謂單線程,是指在JS引擎中負(fù)責(zé)解釋和執(zhí)行JavaScript代碼的線程只有一個(gè)。不妨叫它主線程。 但是實(shí)際上還存在其他的線程。例如:處理AJAX請求的線程、處理DOM事件的線...
摘要:給出了解決方案就是單線程,遠(yuǎn)離線程鎖,狀態(tài)同步的問題,使用異步讓單線程遠(yuǎn)離阻塞,高效利用。而實(shí)際上的異步是采用了線程池技術(shù),發(fā)起異步時(shí),把操作扔到線程池里面執(zhí)行,然后主線程繼續(xù)執(zhí)行其他操作,執(zhí)行完畢通過線程間通信通知主線程,主線程執(zhí)行回調(diào)。 異步IO,事件驅(qū)動(dòng),單線程構(gòu)成了node的基調(diào),為什么異步IO在node中如此重要呢? 我們先來說一下異步的概念,異步常見于前端開發(fā),例如ajax...
摘要:通過管理組件通信通過驅(qū)動(dòng)視圖比較差異進(jìn)行更新操作作者第七頁鏈接來源知乎著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)。達(dá)到無刷新的效果。對象的狀態(tài)不受外界影響。對象代表一個(gè)異步操作,有三種狀態(tài)進(jìn)行中已完成,又稱和已失敗。 以下問題解釋非本人原創(chuàng),是根據(jù)面試經(jīng)驗(yàn)整理后覺得更容易理解的解釋版本,歡迎補(bǔ)充。 一. 輸入url后的加載過程 從輸入 URL 到頁面加載完成的過程中都發(fā)生了什么 計(jì)算機(jī)...
摘要:通過管理組件通信通過驅(qū)動(dòng)視圖比較差異進(jìn)行更新操作作者第七頁鏈接來源知乎著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)。達(dá)到無刷新的效果。對象的狀態(tài)不受外界影響。對象代表一個(gè)異步操作,有三種狀態(tài)進(jìn)行中已完成,又稱和已失敗。 以下問題解釋非本人原創(chuàng),是根據(jù)面試經(jīng)驗(yàn)整理后覺得更容易理解的解釋版本,歡迎補(bǔ)充。 一. 輸入url后的加載過程 從輸入 URL 到頁面加載完成的過程中都發(fā)生了什么 計(jì)算機(jī)...
閱讀 3358·2021-11-10 11:36
閱讀 3254·2021-10-08 10:21
閱讀 2889·2021-09-29 09:35
閱讀 2433·2021-09-22 16:06
閱讀 3994·2021-09-09 09:33
閱讀 1341·2019-08-30 15:44
閱讀 3183·2019-08-30 10:59
閱讀 2995·2019-08-29 15:32