簡體   English   中英

如何將Node Promise和http一起使用?

[英]How do I use node Promise and http together?

我正在嘗試了解節點中的Promises。 我希望能夠將http.request用作承諾。 這是我到目前為止所學到的。

我使用setTimeout設置了一個測試用例,如下所示:

var makePromise = (txt, milli) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {  // fn(cb)
            console.log("I promise to...")
            resolve(txt)
        }, milli)
    });
}

var p = makePromise("Come Home", 3000);
var q = makePromise("Go Shopping", 1000);

var tasks = [p, q];

console.log("Start with ", tasks);

Promise.all(tasks).then((res) => {
    console.log(res);
    console.log("Finish");
})

這很好。 現在我想我所要做的就是用適當的http.request替換setTimeout函數。 但這似乎並不那么簡單。

這是當前的嘗試。

var makePromise = (collection, item) => {
    var options = {
        method: "PUT",
        port: 9000,
        host: "localhost",
        path: `/${collection}/item/${item.Label.itemUUID}`,
        headers: {
            "Accept": "application/json",
            "Content-type": "application/json",
            "Content-length": JSON.stringify(req.body).length
        }
    };
    console.log(JSON.stringify(options));

    var httpPromise = new Promise((resolve, reject) => {
        var vot = http.request(options, (votResponse) => {
            var responseBody = [];
            votResponse.on('data', (chunk) => {
                console.log(`Got ${chunk.length} ${chunk}`);
                responseBody.push(chunk);
            });
            votResponse.on('end', () => {
                console.log("End of http");
                console.log("After web proxy like call - raw data: ", Buffer.concat(responseBody).toString());
                responseBody.json = JSON.parse(Buffer.concat(responseBody).toString());
                resolve(responseBody.json);
            });
            votResponse.on('error', (err) => {
                reject(err);
            });
        })
        vot.write(JSON.stringify(item));
        vot.end();
    });
    return httpPromise;
};

我知道有一些像“請求承諾”之類的庫可以提供幫助,但是我希望在使用庫之前對本機操作有更深入的了解。 誰能指出我如何使這種方法起作用?

調用代碼如下所示:

var collection = req.params.collection;
var patchInstruction = req.body.patchInstruction;
switch (patchInstruction) {
    case "CASCADE DELETE": 
        console.log("CASCADE DELETE on", collection, req.body.item);
        var tasks = [req.body.item].concat(req.body.asSubject).concat(req.body.asObject);
        tasks = tasks.map((e, i, a) => {
            e.Item = "DELETED"
            return makeDeletePromise(collection, e); // a promise to do the http PUT
        });
        console.log("WIP ", tasks);
        Promise.all(tasks).then((res) => {
            console.log("To client --> ",res);
            res.send(res);  
        })
        break;
    default:    
        console.log("No path to ",patchInstruction);
        res.send(409);
        break;
}

永遠不會發生對端口9000的調用。

它總是一個好主意,以結束與一個承諾鏈條catch通話。 否則,在諾言鏈中發生的任何錯誤都會被“吞噬”-您根本看不到它。

因此,任何時候有then應該有一個catch

Promise.all(tasks).then((res) => {
    console.log("To client --> ", res);
    res.send(res);
}).catch((err) => console.log(err));

我相信,錯誤是在res.send(res)附近,因為http的res被本地res 這實際上是responseBody.json ,因此它沒有send方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM