成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Node.js模擬發(fā)起http請求從異步轉(zhuǎn)同步的5種方法

TalkingData / 906人閱讀

摘要:使用模擬發(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

相關(guān)文章

  • (轉(zhuǎn))JavaScript:同步異步和事件循環(huán)

    摘要:事件循環(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事件的線...

    android_c 評論0 收藏0
  • node.js異步IO 第一篇

    摘要:給出了解決方案就是單線程,遠(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...

    feng409 評論0 收藏0
  • 最近遇到前端面試題(2017.03.08更新版)

    摘要:通過管理組件通信通過驅(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ī)...

    Nosee 評論0 收藏0
  • 最近遇到前端面試題(2017.03.08更新版)

    摘要:通過管理組件通信通過驅(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ī)...

    劉東 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<