等待回调结果,然后继续执行节点js

时间:2019-11-07 14:49:22

标签: node.js typescript

我有一个用节点js编写的服务。它的工作是连接到azure存储器,下载一个文件并将其返回为base64。

这是我到目前为止所做的:

` var azure = require('azure-storage');
const fs = require('fs');
var fileService = azure.createFileService('microsoftdata');
var test = await fileService.getFileToStream('sharename', '', filename, fs.createWriteStream(filename), async function (error, result, response) {
  if (!error) {
    console.log('result ' + JSON.stringify(result, null, 4));
    var bitmap = await fs.readFileSync(filename);
    return bitmap.toString('base64');
    // var str = getFileAsBase64(filename);
    // console.log('str - ' + str);

    // return str;
    // file downloaded
  }
  else {
    console.log('error - ' + JSON.stringify(error, null, 4));
  }

});
console.log('test - ' + test);`

现在发生的是:下载文件->在var'test'中返回文件的数据->完成下载,进入回调并将base64返回到无处。

我要实现的是:下载文件->等待完成->完成并输入回调->返回base64以测试他范围内的另一个变量。

谢谢。

2 个答案:

答案 0 :(得分:1)

所以这里有两个可能的问题,但是我不是Azure专家,文档尚不明确,所以我只给你们两个。

  1. getFileToStream是否真的返回了承诺?它没有说在documentation中有,所以我不知道。如果不是,并且您仍然想使用异步/等待,则需要将其包装在new Promise()中。像这样:
var azure = require('azure-storage');
const fs = require('fs');
var fileService = azure.createFileService('microsoftdata');
var test = await new Promise((res, rej) => {
    fileService.getFileToStream('sharename', '', filename, fs.createWriteStream(filename), async function (error, result, response) {
        if (!error) {
            console.log('result ' + JSON.stringify(result, null, 4));
            var bitmap = await fs.readFileSync(filename);
            res(bitmap.toString('base64'));
            // var str = getFileAsBase64(filename);
            // console.log('str - ' + str);

            // return str;
            // file downloaded
        }
        else {
            rej('error - ' + JSON.stringify(error, null, 4));
        }
    });
})

console.log('test - ' + test);
  1. 返回bitmap.toString('base64)可能不会设置test的值。我建议在等待test之前初始化getFileToStream,然后在回调函数中设置其值。像这样:
var azure = require('azure-storage');
const fs = require('fs');
var fileService = azure.createFileService('microsoftdata');
var test
await fileService.getFileToStream('sharename', '', filename, fs.createWriteStream(filename), async function (error, result, response) {
  if (!error) {
    console.log('result ' + JSON.stringify(result, null, 4));
    var bitmap = await fs.readFileSync(filename);
    test = bitmap.toString('base64');
    // var str = getFileAsBase64(filename);
    // console.log('str - ' + str);

    // return str;
    // file downloaded
  }
  else {
    console.log('error - ' + JSON.stringify(error, null, 4));
  }

});
console.log('test - ' + test);

答案 1 :(得分:1)

尝试创建并兑现承诺

sudo apt install maven