鍍金池/ 問(wèn)答/HTML/ Express 爬蟲(chóng)`Promise` 把異步變成同步問(wèn)題?

Express 爬蟲(chóng)`Promise` 把異步變成同步問(wèn)題?

圖片描述

clipboard.png

為什么 console.log("Promise",helper.httpClient()); 的結(jié)果是 undefined。看這個(gè)打印的信息,分明這里router.get()Promise 并沒(méi)有把異步變成同步,沒(méi)有等 helper.httpClient() 結(jié)果的返回就已經(jīng)往下執(zhí)行了?

Node.js的版本是 v8.9.0 ,系統(tǒng)是centos7.
Promise undefined
arr.length undefined
GET /main 304 283.076 ms - -
GET /stylesheets/style.css 304 3.099 ms - -
GET /javascripts/echarts.min.js 304 2.888 ms - -
arr.length123 xxxx
arr.length123 xxxx
xxxx 這個(gè)是爬回來(lái)的結(jié)果。
回答
編輯回答
悶騷型

httpClient函數(shù)還是被調(diào)用有沒(méi)有指定return,就是默認(rèn)返回undefinded
而你需要做的就是:
傳入一個(gè)回調(diào)函數(shù)給httpClient



function httpClient(callback){

    new Promise(function(resovle,reject){
        //模擬異步執(zhí)行
        setTimeout(function(){
            resovle("DONE~~~~~");
            //reject(new Error("failed"));
        },1000);
    }).then(function(resultData){
        console.log("++++")
        callback&&callback.apply(null,[null,resultData]);
    }).catch(function(error){
        callback&&callback.apply(null,[error]);
    });
}


function runHttpClient(){
    new Promise(function(resovle,reject){
        httpClient(function(error,data){
            if(error){
                reject(error);
                return;
            }
            resovle(data);
        });
    }).then(function(result){
        console.log(">>>"+result);
    }).catch(function(error){
        console.err(error);
    });
}

runHttpClient();

或者讓httpClient返回一個(gè)promise

function httpClient_promise(){

    return new Promise(function(resovle,reject){
        //模擬異步執(zhí)行
        setTimeout(function(){
            resovle("DONE~~~~~");
            //reject(new Error("failed"));
        },1000);
    });
}

function runHttpClient2(){
    httpClient_promise().then(function(result){
        console.log(">>>"+result);
    }).catch(function(error){
        console.err(error);
    });
}

runHttpClient2();
2018年1月23日 06:06
編輯回答
嫑吢丕

你的httpClient函數(shù)應(yīng)該返回一個(gè)promise對(duì)象,調(diào)用也應(yīng)該是 httpClient().then ,或者用 async/await 的寫(xiě)法:

const httpClient = function () {
    const options = {
        // ...
    };
    return new Promise((resolve, reject) => {
        http.get(options, (res) => {
            // ...
            // 你的 error 哪去了?
            res.on('end', () => {
                resolve(tr)
            })
        })
    })
}


//調(diào)用-- async/await,基于promise
router.get('/', async (req, resp, next) => {  
    let promise = new Promise(async (resolve, reject)=>{
        const result = await httpClient();
    })
})
2018年4月24日 13:42