在node.js中异步处理多个返回

安德鲁·摔跤手

我选择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中变得有意义

乔希·比姆(Josh Beam)

在较高的级别上,您可以并行启动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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章