簡體   English   中英

承諾功能在單獨的文件中

[英]Promise function in separate file

我可以讓此函數在一個文件中工作,但我想通過分成多個文件來保持事物整潔。

// library.js file
module.exports = {
    get: () =>{
        return new Promise((reject, resolve) =>{
            return resolve(https.get('https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token, (res) =>{
                res.setEncoding('utf8');
                return res.on('data', (data) =>{
                    return data;
                });
            }));
        });
    }
}

我嘗試記錄此內容,但未顯示任何內容?

// server.js file
igLib.get().then((data) => {
    console.log("testing: " + data);
})

但是,如果我只是做一個簡單的日志。

// server.js file
console.log(igLib.get());

我以某種方式沒有res.setEncoding('utf8')獲得數據。

關於該怎么做的任何提示?

更新:我無法兌現承諾,對那些為我提供了很好的答案的人感到抱歉,但是我繼續使用請求承諾模塊。 它是這樣的:

// library.js file
var instagramSelfUrl = 'https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token;

module.exports = {
    get: () =>{
        return rp(instagramSelfUrl).then((res) =>{
            return res;
        });
    }
}

這是我console.log的位置:

// server.js file
    igLib.get().then((data) =>{
    console.log(data);
});

它更簡單並且有效。 如果除了使用模塊可以解決問題以外,還有其他解決方法,請告知並發布! 謝謝所有發布和幫助的人!

您創建的承諾應使用響應中的數據進行解析。

// library.js file
const https = require('https');
const instagramSelfUrl = 'https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token;

module.exports = {
    get: () => new Promise(function (resolve, reject) {
        https.get(instagramSelfUrl, res => {
            var chunks = [];
            res.setEncoding('utf8');
            res.on('data', chunk => chunks.push(chunk));
            res.on('end', () => resolve(chunks.join('')));
        });
    })
};

實際上,以上內容並不完整且脆弱。 例如,請求錯誤或響應狀態500應該拒絕諾言,但是沒有錯誤處理。 或者,當響應不是真的UTF-8時,它將不正確地解碼數據。 這些只是這里兩個最明顯的問題。

HTTP請求的多樣化是一個已解決的問題。 我強烈建議您使用一個可用的庫,而不要滾動您自己的代碼,這些代碼會再次導致所有錯誤。

const request = require('request-promise');
const instagramSelfUrl = 'https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token;

module.exports = {
    get: () => request(instagramSelfUrl)
};

現在,該功能已完成並且即使在極少數情況下也可以正常運行。 它太短了,以至於幾乎沒有理由編寫一個單獨的函數。

看來您沒有正確返回數據,請嘗試以下操作:

// library.js file
module.exports = {
    get: () =>{
        return new Promise((reject, resolve) =>{
            https.get('https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token, (res) =>{
                res.setEncoding('utf8');
                return res.on('data', (data) =>{
                    return resolve(data);
                });
            });
        });
    }
}

你可以做這樣的事情

module.exports = {
    get: () =>{
        return new Promise((resolve, reject) =>{
            https.get('https://api.instagram.com/v1/users/self/?access_token=' + cred.access_token, (res) =>{
                res.setEncoding('utf8');
                res.on('data', (data) =>{
                    resolve(data);
                });
            }).on('error', (e) => reject(e))
        });
    }
}

有關承諾的更多信息,請訪問https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise

暫無
暫無

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

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