我选择node.js作为我的任务,因为它具有官方的Google API客户端库,并且很自然可以使用JSON。但是我在异步惯用语中挣扎,在互联网上找到的指南并未涵盖我的情况。
因此,在此示例中,我尝试读取两个文件的内容并将它们传递给方法:
var fs = require('fs');
// Some more unrelated vars here
function readFiles(callback) {
fs.readFile('./refresh_token', 'utf8', function(err,refreshToken) {
if (err) throw err;
callback(refreshToken);
});
fs.readFile('./access_token', 'utf8', function(err,accessToken) {
if (err) throw err;
callback(accessToken);
});
};
function handleResults(refreshToken, accessToken) {
oauth2Client.setCredentials({
refresh_token: refreshToken,
access_token: accessToken
});
proceedNext(oauth2Client);
};
function proceedNext(credentialsObject) {
// do some more job
};
readFiles(handleResults);
显然,它不起作用,因为我在第一个位置执行了两个回调。但是,异步执行两个方法,将两个结果都传递给处理方法,然后仅在完成后才继续执行的正确方法(node.js方法)是什么?
我尝试过这样的事情:
function readFiles() {
fs.readFile('./refresh_token', 'utf8', function(err,refreshToken) {
if (err) throw err;
fs.readFile('./access_token', 'utf8', function(err,accessToken) {
if (err) throw err;
oauth2Client.setCredentials({
refresh_token: refreshToken,
access_token: accessToken
});
proceedNext();
});
});
};
在稍微使用全局变量后,它起作用了,但是我认为这是一个可怕的想法,它破坏了node.js的意义。我正在寻找一种正确的方法来实现这一目标,我觉得在通过这堵墙之后,其他一切都应该在node.js中变得有意义
在较高的级别上,您可以并行启动2个诺言,只有在两个诺言都已解决时才能解决:
Promise.all([
new Promise((resolve, reject) => { /* your first fs read */ }),
new Promise((resolve, reject) => { /* your second fs read */ })
]).then(result => {
const refreshToken = result[0]
const accessToken = result[1]
// do more stuff
})
.catch(err => /* handle error */)
您需要查看MDN ES6中PromisePromise
的语法。
要“保证”您的读物之一,它类似于:
new Promise((resolve, reject) => {
fs.readFile('./refresh_token', 'utf8', function(err, refreshToken) {
if (err) {
reject(err)
}
resolve(refreshToken)
})
})
为了使生活更加简单,您可以使用诸如bluebird之类的东西,该鸟提供了自动“散布”东西的API等。
该文档甚至显示本作fs
:
var Promise = require('bluebird');
var fs = Promise.promisifyAll(require("fs"));
fs.readFileAsync("myfile.js", "utf8").then(function(contents) {
console.log(contents);
}).catch(function(e) {
console.error(e.stack);
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句